当前行在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,这会导致问题代码中出现错误。
如果我不隐藏列正常工作,如果我隐藏然后发生错误。 –
发现此:http://msdn.microsoft.com/en-us/library/microsoft.office.tools.word.controls.datagridview.hide.aspx说不应该使用Hide()。你为什么不使用.Visible = False呢? –
@MubarakAli刚刚为自己测试过,如果你调用Hide(),它会将CurrentRow设置为null。所以你必须使用别的东西(比如.Visible = false;) –