2011-11-28 40 views
0

任何人都可以告訴我這段代碼有什麼問題嗎?當我嘗試這個我在當前行當前行在datagridview中返回null c#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace App 
{ 
    public static class General 
    { 
     private static BindingSource source; 
     private static bool typing = false; 
     private static DataGridView dgSuggest; 
     public static int productID; 
     private static ComponentFactory.Krypton.Toolkit.KryptonTextBox txtBox; 
     /// <summary> 
     /// To show the auto suggest 
     /// </summary> 
     /// <param name="parent">Windows.Form</param> 
     /// <param name="tBox">krypton TextBox</param> 
     /// <param name="dataSource">Datasource for the Suggestion</param> 
     /// <param name="indexes">Indexes to hide in suggestion</param> 
     public static void autoSuggest(Form parent,ComponentFactory.Krypton.Toolkit.KryptonTextBox tBox,BindingSource dataSource,int[] indexes) 
     { 
      source = dataSource; 
      txtBox = tBox; 
      dgSuggest = new DataGridView(); 
      parent.Controls.Add(dgSuggest); 
      dgSuggest.BringToFront(); 
      dgSuggest.AllowUserToAddRows = false; 
      dgSuggest.AllowUserToDeleteRows = false; 
      dgSuggest.Location = new System.Drawing.Point(txtBox.Location.X,txtBox.Location.Y + txtBox.Height); 
      dgSuggest.Width = txtBox.Width; 
      dgSuggest.ReadOnly = true; 
      dgSuggest.RowHeadersVisible = false; 
      dgSuggest.DataSource = source; 
      dgSuggest.SelectionMode = DataGridViewSelectionMode.FullRowSelect; 

      dgSuggest.Columns[0].Visible = false; 
      dgSuggest.Columns[2].Visible = false; 
      dgSuggest.Columns[3].Visible = false; 
      dgSuggest.Columns[4].Visible = false; 
      dgSuggest.Columns[5].Visible = false; 
      dgSuggest.Columns[6].Visible = false; 
      dgSuggest.Columns[7].Visible = false; 
      dgSuggest.Columns[8].Visible = false; 
      dgSuggest.Columns[9].Visible = false; 

      dgSuggest.Hide(); 
      dgSuggest.Columns[1].Width = txtBox.Width - 20; 
      txtBox.KeyDown += new KeyEventHandler(txtBox_KeyDown); 
      txtBox.KeyPress += new KeyPressEventHandler(txtBox_KeyPress); 
      txtBox.TextChanged += new EventHandler(txtBox_TextChanged); 
     } 

     private static void txtBox_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (dgSuggest.Visible == false) 
      { 
       dgSuggest.Visible = true; 
      } 

      if (e.KeyCode == Keys.Down) 
      { 
       int rowIndex = 0; 
       if (dgSuggest.Rows.Count > 0) 
       { 
        if (dgSuggest.CurrentRow.Index < dgSuggest.Rows.Count - 1) 
        { 
         rowIndex = dgSuggest.CurrentRow.Index + 1; 
        } 

        dgSuggest.ClearSelection(); 
        dgSuggest.CurrentCell = dgSuggest.Rows[rowIndex].Cells[1]; 
        dgSuggest.Rows[rowIndex].Selected = true; 
       } 
      } 
      else if (e.KeyCode == Keys.Up) 
      { 
       int rowIndex = 0; 
       if (dgSuggest.Rows.Count > 0) 
       { 
        if (dgSuggest.CurrentRow.Index > 0) 
        { 
         rowIndex = dgSuggest.CurrentRow.Index - 1; 
        } 
        else 
        { 
         rowIndex = dgSuggest.Rows.Count - 1; 
        } 

        dgSuggest.ClearSelection(); 
        dgSuggest.CurrentCell = dgSuggest.Rows[rowIndex].Cells[1]; 
        dgSuggest.Rows[rowIndex].Selected = true; 
       } 
      } 
      else if (e.KeyCode == Keys.Enter) 
      { 
       DataGridViewRow row = dgSuggest.CurrentRow; 
       productID = Convert.ToInt32(row.Cells[0].Value); 
       txtBox.Text = Convert.ToString(row.Cells[1].Value); 
       dgSuggest.Hide(); 
      } 
      else if (e.KeyCode == Keys.Back) 
      { 
       if (txtBox.Text != "") 
       { 
        txtBox.Text = txtBox.Text.Substring(0, txtBox.Text.Length - 1); 
       } 
      } 
      else if (e.KeyCode == Keys.Delete) 
      { 
       txtBox.Text = ""; 
      } 

      e.Handled = true; 
     } 


     private static void txtBox_KeyPress(object sender, KeyPressEventArgs e) 
     { 
      if (char.IsControl(e.KeyChar) == false) 
      { 
       txtBox.Text = txtBox.Text + Convert.ToString(e.KeyChar); 
       typing = true; 
      } 

      if(e.KeyChar == Convert.ToChar(Keys.Back)) 
      { 
       typing = true; 
      } 
      e.Handled = true; 
     } 

     private static void txtBox_TextChanged(object sender, EventArgs e) 
     { 
      if (typing) 
      { 
       if (txtBox.Text == "") 
       { 
        source.Filter = ""; 
       } 
       else 
       { 
        MessageBox.Show(source.Filter); 
        source.Filter = "Name LIKE '"+txtBox.Text+"%'"; 
       } 
      } 
      txtBox.SelectionStart = 0; 
      txtBox.SelectionLength = txtBox.Text.Length; 
     } 
    } 
} 

越來越空異常,當我把這種方法的另一種形式像下面

BindingSource source = new BindingSource(); 
source.DataSource = ies.tblProducts; 
General.autoSuggest(this, txtProduct,source,new int[]{0}); 

我得到當前行空異常,當我按下箭頭鍵

回答

0

您確定當您第一次打開您的datagridview時選擇當前行嗎?在您的keydown部分,您應該確保當前行不爲空:

if (dgSuggest.CurrentRow != null && 
    dgSuggest.CurrentRow.Index < dgSuggest.Rows.Count - 1) 
{ 
    rowIndex = dgSuggest.CurrentRow.Index + 1; 
} 

其他部分也是如此。

編輯:下面的附加信息。

來源:Hide()不應該使用。改爲改變DataGridView的Visible屬性。調用Hide()會導致CurrentRow被設置爲null,這會導致問題代碼中出現錯誤。

+0

如果我不隱藏列正常工作,如果我隱藏然後發生錯誤。 –

+1

發現此:http://msdn.microsoft.com/en-us/library/microsoft.office.tools.word.controls.datagridview.hide.aspx說不應該使用Hide()。你爲什麼不使用.Visible = False呢? –

+1

@MubarakAli剛剛爲自己測試過,如果你調用Hide(),它會將CurrentRow設置爲null。所以你必須使用別的東西(比如.Visible = false;) –