从另一个窗体访问字符串
本文关键字:字符串 访问 窗体 另一个 | 更新日期: 2023-09-27 18:29:02
你好,我在form1中有数据网格视图,通过form1我打开form2,通过form2我打开form3,放置在form1中的string named vyber_ID_K
需要在form3中访问(我需要在form3中获取其值)
这放在表格1 中的按钮点击上
form2 a = new form2 ("Novy");
string vyber_IDK = (string)dataGridView1.CurrentRow.Cells["ID_K"].Value.ToString();
a.vyber_ID_K = vyber_IDK;
a.Show();
a.Closed += klient_Closed;
我想访问vyber_ID_K in form 3
,怎么做?我尝试设置public string vyber_ID_K in form2 and pass it similary to form3 but I get null
。我做得对吗?还有其他更好的解决方案吗?
提前谢谢。
根据Servy:我的步骤
点击Form 1 中的按钮
函数vyberIDKGeter=()=>dataGridView1.CurrentRow.Cells["ID_K"].Value.ToString();
try { form2 = new form2 ("Novy"); a.vyberIDKGetter = () => dataGridView1.CurrentRow.Cells["ID_K"].Value.ToString(); a.Show();
}
点击表单2中的按钮2
public Func vyberIDKGeter;private void button1_Click(对象发送方,EventArgs e){nova_platba b=新的nova_pplatba("novy");b.vyberIDKGeter();b.放映();b.闭合+=klient_Closed;}
形式3
Func<string> vyberIDKGetter = veberIDK; string vyberIDK = vyberIDKGetter(); SqlCommand sc = new SqlCommand(@" INSERT INTO kliplat (datum,text,castka,akce,subkey,priznak,rocnik) VALUES (@datum,@text,@castka,@akce,@subkey,@priznak,@rocnik); SELECT scope_identity(); ", spojeni); sc.Parameters.AddWithValue("@subkey", vyberIDK);
所以这里的问题是,当您构建Form2
,甚至Form3
时,您想要的值还不存在。它需要在未来的某个时间点访问数据。我们可以通过利用委托来获得这种行为。
与其将string
传递给Form2
,不如在构造该表单时(因为我们还不知道字符串是什么)传递Func<string>
。该对象将是一个方法,当被调用时,它将提供一个表示所需值的字符串。Form1
可以这样定义它:
Func<string> vyberIDKGetter =
() => dataGridView1.CurrentRow.Cells["ID_K"].Value.ToString();
然后在Form3
中,当它抓住传递的函数时,它可以通过简单地调用委托来获得字符串:
Func<string> vyberIDKGetter = [...];
string vyberIDK = vyberIDKGetter();
这种解决问题的方法特别冒险,因为Form3
不需要知道任何关于Form1
或Form2
的信息。如果有其他调用者想要使用它,他们可以提供自己的委托。如果有开发人员处理每个表单的编码,他们不需要相互交流每个表单的所有内部细节,他们只需要处理此委托的传递,然后就可以将调用者/被调用者视为黑盒。
您必须围绕字符串创建一个公共getter/setter:
public string Vyber_ID_K
get
{
return vyber_ID_K;
}
set
{
vyber_ID_K = value
}
你需要表格2中的表格1和表格3中的表格2的参考资料。这样你就可以访问每个表格。
不能将字符串用作引用参数,因为它是一个不可变的类。字符串C#
通过构造函数传递参数真的很奇怪
form2 a = new form2 ("Novy");
同时通过属性传递另一个参数
a.vyber_ID_K = vyber_IDK;
为什么不通过构造函数传递所有参数呢?
string vyber_IDK = (string)dataGridView1.CurrentRow.Cells["ID_K"].Value.ToString();
form2 a = new form2 ("Novy", vyber_IDK);
和Form2
public class form2
{
private string Name { get; set; }
private int vyber_IDK { get; set; }
public form2( string Name, int vyber )
{
this.Name = Name;
this.vyber_IDK = vyber_IDK;
}
然后,从form2
向form3
传递任何内容的工作方式与相同
form3 f = new form3( this.vyber_IDK );