C# 动态添加的DataGridView未提交所需结果

C# 动态添加的DataGridView未提交所需结果,c#,visual-studio,datagridview,C#,Visual Studio,Datagridview,在这里,我试图创建一个动态数据网格。这将作为文本框中输入的文本的自动完成。当我在文本框中键入内容时,它将搜索数据库并在动态数据网格中显示匹配的值,当我按enter键时,它将在可用的文本框中显示选定的记录 但我面临的问题是,当我按enter键时,我收到一条错误消息,“索引超出范围。必须是非负数且小于集合的大小。” 下面我将粘贴我编写的代码 有人请检查并让我知道可能的错误 private void Form1_Load(object sender, EventArgs e) {

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

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

下面我将粘贴我编写的代码

有人请检查并让我知道可能的错误

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;

                }
            }
        }
private void Form1\u加载(对象发送方,事件参数e)
{
搜索();
}
私有数据网格视图;
私有DataGridViewTextBoxColumn dgviewcol1;
私有DataGridViewTextBoxColumn dgviewcol2;
无效搜索()
{
dgview=新的DataGridView();
dgviewcol1=新的DataGridViewTextBoxColumn();
dgviewcol2=新的DataGridViewTextBoxColumn();
this.dgview.ColumnHeadersHeightSizeMode=System.Windows.Forms.DataGridViews ColumnHeadersHeightSizeMode.AutoSize;
this.dgview.Columns.AddRange(新的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.allowUserToAddress=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();
}
无效搜索(intlx、intly、intdw、intdh、string ColName、string ColSize)
{
this.dgview.Location=新系统.图纸.点(LX,LY);
this.dgview.Size=新系统.Drawing.Size(DW,DH);
字符串[]ClSize=ColSize.Split(',');
//大小
for(int i=0;i0)
{
this.dgview.Visible=true;
dgview.BringToFront();
搜索(150105430200,“产品代码、产品名称”、“100,0”);
//this.dgview.MouseDoubleClick+=new System.Windows.Forms.MouseEventHandler(this.proCode_MouseDoubleClick);
SqlConnection con=newsqlconnection(@“数据源=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Gershone\Source\repos\WindowsFormsApp2\db.mdf;集成安全性=True;连接超时=30”);
SqlDataAdapter sda=新SqlDataAdapter(“从productdetails中选择Top(10)ProductName,ProductID,其中ProductName类似“+”textBox1.Text+“%”,con);
DataTable dt=新的DataTable();
sda.填充(dt);
dgview.Rows.Clear();
foreach(数据行中的数据行)
{
int n=dgview.Rows.Add();
dgview.Rows[n]。单元格[0]。Value=row[“ProductID”]。ToString();
dgview.Rows[n]。单元格[1]。值=行[“ProductName”]。ToString();
}
}
其他的
{
dgview.Visible=false;
}
}
私有void textBox1\u KeyDown(对象发送方,KeyEventArgs e)
{
如果(e.KeyCode==Keys.Enter)
{
如果(dgview.Rows.Count>0)
{
textBox1.Text=dgview.SelectedRows[0]。单元格[0]。值。ToString();
textBox2.Text=dgview.SelectedRows[0]。单元格[1]。值。ToString();
this.dgview.Visible=false;
textBox3.Focus();
}
其他的
{
this.dgview.Visible=false;
}
}
}

此错误的原因是执行语句时

textBox1.Text = dgview.SelectedRows[0].Cells[0].Value.ToString();
将触发
textBox1\u 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();
        }
        // ...
    }
}

设置
dgview.SelectionMode=DataGridViewSelectionMode.FullRowSelect我已经做了更改,但仍然收到相同的错误感谢working.textBox1.TextChanged-=textBox1\u TextChanged;textBox1.Text=dgview.SelectedRows[0]。单元格[0]。值。ToString();textBox2.Text=dgview.SelectedRows[0]。单元格[1]。值。ToString();textBox1.TextChanged+=textBox1\u TextChanged;this.dgview.Visible=false;textBox3.Focus()@史蒂文:如果这个答案对你有帮助,请回答。