【问题标题】:How do I pass DataGridView selected row value to TextBox in another form? [duplicate]如何以另一种形式将 DataGridView 选定的行值传递给 TextBox? [复制]
【发布时间】:2019-11-29 03:39:33
【问题描述】:

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

我试过了:

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

【问题讨论】:

  • 删除 Form2 fr=new Form2();来自 button1_Click 和 CellContentClick 方法并将其粘贴到这两个方法之外。

标签: c# winforms datagridview .net-4.5


【解决方案1】:

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

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

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

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

如果您故意使用ShowDialog() 方法,那么您可以尝试以某种方式绕过此限制。例如,我设法通过使用 Owner 属性(也检查 this answer)和 Form 将所需值从 DataGridView 传递到新创建的 Form(我们称之为 Form2)中的 TextBox。显示 事件。您可以尝试用 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);  

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

【讨论】:

【解决方案2】:

首先,您应该公开 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);

这应该可行。

【讨论】:

  • 但是这会破坏封装。在这种情况下,作者可能并不关心它,但最好还是警告一下。
  • 你是对的。谢谢你的提醒。但就像你说的,作者可能不在乎。
【解决方案3】:
  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();  
}

【讨论】:

  • 这永远行不通。在发布您的答案之前,您是如何阅读其他答案的?
  • 根据您的代码,每次您在第一部分创建一个新对象时创建对象 2 次,然后将值分配给对象,然后接下来您还创建一个未获取值的新对象。跨度>
  • 对象的新实例永远不会得到你的值。
  • 首先,这不是我的代码,我也不是提出这个问题的人。起初我误解了您的代码,可能这会起作用。但是有一些缺点:你打破了封装,如果每次点击按钮都需要创建一个新表单怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多