简体   繁体   中英

current row returns null in datagridview c#

Can anyone tell me whats wrong in this code? when i try this i am getting null exception on current row

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

when i call this method on another form like the following

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

I am getting current row null exception when i press the down arrow key

Due to visible false (dgSuggest.Columns[0].Visible = false;) to the first column of the grid you are facing the problem of the current row is null.

Set the first column of data grid view to visible true (dgSuggest.Columns[0].Visible = true;)

Are you sure the current row is selected when you first open your datagridview? In your keydown section, you should make sure that the current row is not null:

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

The same applies to other sections.

EDIT: Additional information below.

Source: Hide() should not be used. Prefer changing the Visible property of the DataGridView instead. Calling Hide() causes the CurrentRow to be set to null, which causes errors in the code of the question.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM