在datagridviewc#中,当前行返回null



谁能告诉我这段代码有什么问题?当我尝试这个,我得到null异常在当前行

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});

当我按下向下箭头键

时,我得到当前行null异常

您确定第一次打开datagridview时选择了当前行吗?在keydown部分,您应该确保当前行不为空:

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

同样适用于其他部分。

编辑:下面的附加信息。

Source: Hide()不应该被使用。更喜欢改变DataGridView的Visible属性。调用Hide()会导致CurrentRow被设置为null,从而导致问题的代码出现错误。

由于可见false (dgSuggest.Columns[0].Visible = false;)到网格的第一列,您面临的问题是当前行为空。

设置数据网格视图的第一列为可见true (dgSuggest.Columns[0].Visible = true;)

最新更新