текущая строка возвращает ноль в datagridview c # - PullRequest
0 голосов
/ 28 ноября 2011

Может кто-нибудь сказать мне, что не так в этом коде?Когда я пытаюсь это сделать, я получаю нулевое исключение в текущей строке

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

Я получаю нулевое исключение текущей строки, когда янажмите клавишу со стрелкой вниз

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Из-за видимого значения false (dgSuggest.Columns[0].Visible = false;) для первого столбца сетки, с которым вы столкнулись, проблема текущей строки равна нулю.

Установите для первого столбца представления таблицы данных видимое значение true (dgSuggest.Columns[0].Visible = true;)

0 голосов
/ 28 ноября 2011

Вы уверены, что текущая строка выбрана, когда вы впервые открываете сетку данных?В своем разделе ключей вы должны убедиться, что текущая строка не равна нулю:

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

То же самое относится и к другим разделам.

РЕДАКТИРОВАТЬ: дополнительная информация ниже.

Источник: Hide () не должен использоваться.Вместо этого предпочтите изменить свойство Visible объекта DataGridView.Вызов Hide () приводит к тому, что CurrentRow устанавливается в null, что вызывает ошибки в коде вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...