如何将 DataGridView 选定的行值以另一种形式传递给 TextBox?

How do I pass DataGridView selected row value to TextBox in another form?

我在 .NET 4.5.2 上使用 Windows 表单。我有2个表格。 Form1 有一个 DataGridView,其中包含来自数据库的字段和一个在单击时显示 Form2 的按钮。 Form2 有一个文本框。当我单击 Form1 中的按钮时,我想用来自 Form1 DataGridView 字段之一的文本填充它。可能吗? Form2 文本框修饰符设置为 public 但它仍然不起作用。

我试过:

private void DataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    Form2 fr = new Form2();
    int row = DataGridView1.CurrentRow.Index;
    fr.Textbox1.Text = Convert.ToString(DataGridView1[0, row].Value);
    fr.Textbox2.Text = Convert.ToString(DataGridView1[1, row].Value);    
}

private void button1_Click(object sender, EventArgs e)
{
    Form2 fr = new Form2();
    fr.ShowDialog();  
}

首先你应该做 Form1 的 datagridview 修改器 public。 当您单击 Form1 中的按钮时,打开 Form2 并将此代码写入 Form2_Load().

 Form1 frm = (Form1)Application.OpenForms["Form1"];
 int row = frm.DataGridView1.CurrentRow.Index;
 Textbox1.Text = Convert.ToString(frm.DataGridView1[0, row].Value);
 Textbox2.Text = Convert.ToString(frm.DataGridView1[1, row].Value);

这应该有效。

您的问题存在是因为您使用的是 ShowDialog() 方法而不是 Show()。来自 Stack Overflow 上的 this answer

The Show function shows the form in a non modal form. This means that you can click on the parent form.

ShowDialog shows the form modally, meaning you cannot go to the parent form.

这与将值从一种形式传递到另一种形式相互作用,我认为这是因为第一种形式在 ShowDialog() 方法之后被阻止(暂停),因此阻止您从 DataGridView 复制值。

如果你故意使用了ShowDialog()方法,那么你可以尝试以某种方式绕过这个限制。例如,我设法通过使用 Owner 属性(检查 this answer )和 Form.Shown 事件。您可以尝试在 button1_Click 事件处理程序中用这段代码替换您的代码(或者可能只是在您的文件中使用 Form2 class 创建 Shown 事件处理程序):

Form2 fr = new Form2();
int row = DataGridView1.CurrentRow.Index;
fr.Shown += (senderfr, efr) => 
{
    // I did null check because I used the same form as Form2 :) 
    // You can probably omit this check.
    if (fr.Owner == null) return;

    var ownerForm = (Form1)fr.Owner;
    fr.Textbox1.Text = ownerForm.DataGridView1[0, row].Value.ToString();
    fr.Textbox2.Text = ownerForm.DataGridView1[1, row].Value.ToString();
};
fr.ShowDialog(this);  

P.S. 为什么要使用 Convert.ToString() 而不是像我一样简单地调用值 属性 上的 ToString() 方法在示例中?

  Form2 fr = new Form2();
  private void DataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    int row = DataGridView1.CurrentRow.Index;
    fr.Textbox1.Text = Convert.ToString(DataGridView1[0, row].Value);
    fr.Textbox2.Text = Convert.ToString(DataGridView1[1, row].Value);    
}

private void button1_Click(object sender, EventArgs e)
{
    fr.ShowDialog();  
}