【问题标题】:Dynamic added DataGridView not submitting the required result动态添加的 DataGridView 未提交所需的结果
【发布时间】:2021-04-10 18:01:23
【问题描述】:

我在这里尝试创建一个动态数据网格。这将作为在文本框中输入的文本的自动完成。当我在文本框中输入内容时,它将搜索数据库并在动态数据网格中显示匹配的值,当我按下回车键时,它将在可用的文本框中显示选定的记录。

但我面临的问题是,当我按下回车键时,我收到一条错误消息,因为“索引超出范围。必须是非负数且小于集合的大小。”

下面是我写的代码

请有人检查并告诉我可能的错误。

private void Form1_Load(object sender, EventArgs e)
        {
            Search();

        }


        private DataGridView dgview;
        private DataGridViewTextBoxColumn dgviewcol1;
        private DataGridViewTextBoxColumn dgviewcol2;

        void Search()
        {
            dgview = new DataGridView();
            dgviewcol1 = new DataGridViewTextBoxColumn();
            dgviewcol2 = new DataGridViewTextBoxColumn();
            this.dgview.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            this.dgview.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.dgviewcol1, this.dgviewcol2 });
            this.dgview.Name = "dgview";
            dgview.Visible = false;
            this.dgviewcol1.Visible = false;
            this.dgviewcol2.Visible = false;
            this.dgview.AllowUserToAddRows = false;
            this.dgview.RowHeadersVisible = false;
            //this.dgview.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
            dgview.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            this.Controls.Add(dgview);
            this.dgview.ReadOnly = true;
            dgview.BringToFront();
        }

        void Search(int LX, int LY, int DW, int DH, string ColName, String ColSize)
        {
            this.dgview.Location = new System.Drawing.Point(LX, LY);
            this.dgview.Size = new System.Drawing.Size(DW, DH);

            string[] ClSize = ColSize.Split(',');
            //Size
            for (int i = 0; i < ClSize.Length; i++)
            {
                if (int.Parse(ClSize[i]) != 0)
                {
                    dgview.Columns[i].Width = int.Parse(ClSize[i]);
                }
                else
                {
                    dgview.Columns[i].AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
                }
            }
            //Name 
            string[] ClName = ColName.Split(',');

            for (int i = 0; i < ClName.Length; i++)
            {
                this.dgview.Columns[i].HeaderText = ClName[i];
                this.dgview.Columns[i].Visible = true;
            }
        }

        bool change = true;

private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (textBox1.Text.Length > 0)
            {
                this.dgview.Visible = true;
                dgview.BringToFront();
                Search(150, 105, 430, 200, "Product Code,Product Name", "100,0");
                //this.dgview.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.proCode_MouseDoubleClick);
                SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Gershone\source\repos\WindowsFormsApp2\db.mdf;Integrated Security=True;Connect Timeout=30");
                SqlDataAdapter sda = new SqlDataAdapter("Select Top(10) ProductName,ProductID From productdetails WHERE ProductName Like '" + textBox1.Text + "%'", con);
                DataTable dt = new DataTable();
                sda.Fill(dt);
                dgview.Rows.Clear();
                
                foreach (DataRow row in dt.Rows)
                {
                    int n = dgview.Rows.Add();
                    dgview.Rows[n].Cells[0].Value = row["ProductID"].ToString();
                    dgview.Rows[n].Cells[1].Value = row["ProductName"].ToString();
                }
            }
            else
            {
                dgview.Visible = false;
            }
        }

        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (dgview.Rows.Count > 0)
                {
                    textBox1.Text = dgview.SelectedRows[0].Cells[0].Value.ToString();
                    textBox2.Text = dgview.SelectedRows[0].Cells[1].Value.ToString();
                    this.dgview.Visible = false;
                    textBox3.Focus();
                }
                else
                {
                    this.dgview.Visible = false;

                }
            }
        }

【问题讨论】:

  • 设置dgview.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
  • 我进行了更改,但仍然收到相同的错误

标签: c# visual-studio datagridview


【解决方案1】:

这个错误的原因是你执行语句的时候

textBox1.Text = dgview.SelectedRows[0].Cells[0].Value.ToString();

textBox1_TextChanged 将被触发。然后它调用dgview.Rows.Clear();,所有行都会被删除。

尝试取消订阅活动TextChanged并重新订阅。

textBox1.TextChanged -= textBox1_TextChanged;
textBox1.Text = dgview.Rows[rowIndex].Cells[0].Value.ToString();
textBox2.Text = dgview.Rows[rowIndex].Cells[1].Value.ToString();
textBox1.TextChanged += textBox1_TextChanged;

既然你已经把数据保存到了DataTable,为什么不从DataTable中获取数据呢?

首先,将dt 声明为全局变量。

DataTable dt; // global variable

private void textBox1_TextChanged(object sender, EventArgs e)
{
    if (textBox1.Text.Length > 0)
    {
        // ...
        SqlDataAdapter sda = new SqlDataAdapter("Select Top(10) ProductName,ProductID From productdetails WHERE ProductName Like '" + textBox1.Text + "%'", con);
        dt = new DataTable();
        sda.Fill(dt);
        // ...
    }
    // ...
}

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        if (dgview.Rows.Count > 0)
        {
            // get row index
            int rowIndex = dgview.SelectedRows[0].Index;
            textBox1.Text = dt.Rows[rowIndex][0].ToString();
            textBox2.Text = dt.Rows[rowIndex][1].ToString();
            this.dgview.Visible = false;
            textBox3.Focus();
        }
        // ...
    }
}

【讨论】:

  • textBox1.TextChanged -= textBox1_TextChanged; textBox1.Text = dgview.SelectedRows[0].Cells[0].Value.ToString(); textBox2.Text = dgview.SelectedRows[0].Cells[1].Value.ToString(); textBox1.TextChanged += textBox1_TextChanged; this.dgview.Visible = false; textBox3.Focus();
  • @SteveHere 如果这个答案对你有帮助,请vote on / click to accept it
猜你喜欢
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2013-04-14
  • 2020-02-10
  • 1970-01-01
  • 2016-11-18
相关资源
最近更新 更多