将数据从一种形式传递到另一种形式的问题
Posted
技术标签:
【中文标题】将数据从一种形式传递到另一种形式的问题【英文标题】:Issue passing the data from one form to another 【发布时间】:2017-06-07 11:45:54 【问题描述】:概述:
将数据从一种形式传递到另一种形式。
这是一个 WinForm 应用程序,它有两个表单,名为 form1
和 PostCodeForm
。我需要通过clickEvent
将短期表单PostcodeForm
中的数据传递回Form1,然后关闭表单。这些值存储在PostcodeSearch
类中的dataTable
中,要访问它们我:
循环遍历PostCodeForm
中的dataTable
for (var item = 0; item < retreiveResults.Count; item++)
var num = dataGridView2.Rows.Add();
dataGridView2.Rows[num].Cells[0].Value = retreiveResults[item].City;
dataGridView2.Rows[num].Cells[1].Value = retreiveResults[item].District;
dataGridView2.Rows[num].Cells[2].Value = retreiveResults[item].HouseName;
在PostCodeForm
中创建了Form1
的实例:
Form1 formIndi = new Form1();
然后在PostCodeForm
中创建了一些在循环结束之前初始化的局部变量
var _City_Cell = dataGridView2.Rows[num].Cells[0].Value;
var _District_Cell = dataGridView2.Rows[num].Cells[1].Value;
var _HouseName_Cell = dataGridView2.Rows[num].Cells[2].Value;
然后将它们传递给Form1
(在PostCodeForm
):
formIndi.txt_City.Text = _StreetName_Cell.ToString();
formIndi.txt_HouseName.Text = _HouseName_Cell.ToString();
formIndi.txt_ District.Text = _District_Cell.ToString();
我需要将数据传回主窗体并将其存储在相关的文本框中。
问题
我的问题是我的文本框都没有使用给定的值进行更新,但是当我在 postCodeForm 中调试变量时,我可以看到这些值,所以我不知道为什么文本框没有显示值,因为我一直以这种方式将数据从表单传递到表单。
【问题讨论】:
试试 Form1 form1 = (this);因为您正在编辑另一个实例化表单,而不是渲染的表单,我猜 请为每个代码 sn-ps 指定一个类名。此外,您可能想澄清您的命名:PostCodeForm
是什么,它与PostcodeSearch
有何不同? formIndi
是什么?
@defaultlocale 抱歉只是一个格式错误,现在已更正。 PostcodeSearch
是 PostcodeForm
而 formIndi 只是 Form1 的一个实例
@whatdoyouNeedFromMe,所以就像我说的那样,在两个变量中链接,当你通过代码实例化一个表单时,你没有渲染它,所以标签变空了,因为渲染的表单没有绑定数据
@whatdoyouNeedFromMe 好多了,谢谢 :) 现在,问题本身。您的意思是您使用调试工具验证了这一行formIndi.txt_City.Text = _StreetName_Cell.ToString();
上的_StreetName_Cell.ToString()
具有您需要的值。如果这是正确的,那么我们必须假设在这一行之后有东西覆盖了txt_City.Text
。
【参考方案1】:
正如@Ferus7 指出的那样,您正在创建Form1
的新实例,而不是更新主表单中的值。
//new instance with new text boxes and values
Form1 formIndi = new Form1();
//updates the control in the new form, doesn't affect the caller.
formIndi.txt_City.Text = _StreetName_Cell.ToString();
如果您想从PostcodeForm
检索值,有多种方法可以做到这一点。一种选择是在PostcodeForm
中声明属性/方法并通过它们检索值:
//declaration in PostcodeForm
class PostcodeForm
//...
public string StreetName get; private set;
//after data retrieval
StreetName = _StreetName_Cell.ToString();
//call PostcodeForm from Form1
postcodeForm = new PostcodeForm();
postcodeForm.ShowDialog();
//after that, get the value
txt_City.Text = postcodeForm.StreetName;
另一种方法是将Form1
的引用传递给PostcodeForm
:
class PostcodeForm
//declare field
private final Form1 parent;
//create a constructor that accepts `Form1`
PostcodeForm(Form1 parent)
this.parent = parent;
//... (InitializeComponents, etc.)
//update parent as necessary
parent.txt_City.Text = postcodeForm.StreetName;
//Sample call from Form1
postcodeForm = new PostcodeForm(this);
postcodeForm.ShowDialog();
【讨论】:
【参考方案2】:渲染新的实例表单
Form1 PostCodeForm= new Form1();
PostCodeForm.Show();
Application.Run();
【讨论】:
感谢您的回答,但如果我将其实现到我的表单 PostCodeForm 中,我仍然对此感到困惑,因为它仍然会创建一个新的 form1 实例以上是关于将数据从一种形式传递到另一种形式的问题的主要内容,如果未能解决你的问题,请参考以下文章
MSoft Access - 将变量从一种形式传递到另一种形式