C#从动态创建的事件中传递变量

时间:2018-02-05 13:30:24

标签: c# dynamic datagridview

我的问题是这样的:我有一个在运行时在它自己的函数中创建的表单,它接受2个参数从dataGridView中检索文本值并将其显示在textBox中。问题是,当我自己调用这个函数时它工作正常但是当从另一个运行时创建的表单控件事件调用时,没有返回文本值但仍然显示表单。

这是创建和显示形式的代码:

private void commentsForm(int x, int y)
        {
            using (Form frmDisplayText = new Form())
            {
                TextBox txt = new TextBox();//                  <- Decleration
                Button btnAccept = new Button();
                Button btnRevert = new Button();
                Button btnClose = new Button();
                frmDisplayText.Size = new Size(550, 350);//     <- Size
                txt.Size = new Size(510, 250);
                btnAccept.Size = new Size(216, 30);
                btnRevert.Size = new Size(216, 30);
                btnClose.Size = new Size(66, 30);
                txt.Location = new Point(12, 12);//             <- Location
                btnAccept.Location = new Point(12, 269);
                btnRevert.Location = new Point(234, 269);
                btnClose.Location = new Point(456, 269);
                string dataToOutput = dataGridView1.Rows[x].Cells[y].Value.ToString();//  <- Text
                txt.Text = dataToOutput;
                frmDisplayText.Text = "Comments";
                btnAccept.Text = "Accept";
                btnRevert.Text = "Revert";
                btnClose.Text = "Cancel";
                txt.Multiline = true;//                         <- Other
                btnAccept.Font = new Font(FontFamily.GenericSansSerif, 12.0F, FontStyle.Regular);
                btnRevert.Font = new Font(FontFamily.GenericSansSerif, 12.0F, FontStyle.Regular);
                btnClose.Font = new Font(FontFamily.GenericSansSerif, 12.0F, FontStyle.Regular);

                btnAccept.Click += (_, args) =>//               <- Event Handlers
                {
                    string txtText = txt.Text;
                    using (var conn = new SqlConnection(connection))
                    {
                        string SQL = "UPDATE Comments SET [" + dataGridView1.Rows[x].Cells[y].OwningColumn.HeaderText.ToString() + "] = @val2 WHERE ID = @val3";
                        using (var cmd = new SqlCommand(SQL, conn))
                        {
                            cmd.Parameters.AddWithValue("@val2", txt.Text);
                            cmd.Parameters.AddWithValue("@val3", dataGridView1.Rows[x].Cells[0].Value.ToString());
                            try
                            {
                                conn.Open();
                                cmd.ExecuteNonQuery();
                                dataGridView1.Rows[x].Cells[y].Value = txt.Text;
                                MessageBox.Show("Success");
                            }
                            catch (SqlException ex)
                            {
                                MessageBox.Show(ex.ToString());
                            }
                        }
                    }
                };
                btnRevert.Click += (_, args) =>
                {
                    txt.Text = dataToOutput;
                };
                btnClose.Click += (_, args) =>
                {
                    frmDisplayText.Close();
                };
                frmDisplayText.Controls.Add(txt);//             <- Add Controls
                frmDisplayText.Controls.Add(btnAccept);
                frmDisplayText.Controls.Add(btnRevert);
                frmDisplayText.Controls.Add(btnClose);
                frmDisplayText.ShowDialog();
            }
        }

这就是它的召唤:

                btnAddComment.Click += (_, args) =>
                {
                    commentsForm(x, y);
                };

关于为什么text属性在此处调用时为null的任何想法?

全部谢谢

1 个答案:

答案 0 :(得分:0)

行索引的附加内容是丢弃要检索的数据。