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

时间:2019-11-29 03:39:33

标签: c# winforms datagridview .net-4.5

我正在.NET 4.5.2上使用Windows窗体。我有2种表格。 Form1具有一个DataGridView,其中包含数据库中的字段,以及一个单击时显示Form2的按钮。 Form2有一个TextBox。当我单击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();  
}

3 个答案:

答案 0 :(得分:0)

首先,您应该公开Form1的datagridview修饰符。 当您单击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);

这应该有效。

答案 1 :(得分:0)

您的问题存在,因为您使用的是ShowDialog()而不是Show()方法。从this answer开始堆栈溢出:

  

Show函数以非模式形式显示表单。这意味着您可以单击父表单。

     

ShowDialog以模态显示表单,这意味着您无法转到父表单。

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

如果您故意使用ShowDialog()方法,则可以尝试以某种方式绕过此限制。例如,通过使用 Owner 属性(也选中this answer)和,我设法将所需的值从DataGridView传递到新创建的Form(称为Form2)中的TextBox中。 Form.Shown 事件。您可以尝试在 button1_Click 事件处理程序中将此代码替换为这段代码(或者可能只是使用Form2类在文件中创建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);  

建议。为什么您会使用Convert.ToString()而不是像我在示例中那样简单地在Value属性上调用ToString()方法?

答案 2 :(得分:0)

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