当前行在datagridview中返回null c#

问题描述:

任何人都可以告诉我这段代码有什么问题吗?当我尝试这个我在当前行当前行在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}); 

我得到当前行空异常,当我按下箭头键

您确定当您第一次打开您的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;) –