你好我在form1中有datagridview,通过form1我打开form2,通过form2我打开form3,放在Form1中的string named vyber_ID_K
需要在Form3中访问(我需要在Form3中获取它的值)
这是在form1
上单击按钮 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的说法,我一步一步:
按钮单击表单1
Func vyberIDKGetter =()=> 。dataGridView1.CurrentRow.Cells [ “ID_K”] Value.ToString();
try
{
form2 = new form2 ("Novy");
a.vyberIDKGetter = () => dataGridView1.CurrentRow.Cells["ID_K"].Value.ToString();
a.Show();
}
按钮点击form2
public Func vyberIDKGetter; private void button1_Click(object sender,EventArgs e) { nova_platba b = new nova_platba(“novy”); b.vyberIDKGetter(); b.Show(); b.Closed + = klient_Closed; }
在form3中
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);
答案 0 :(得分:0)
你必须在字符串周围创建一个公共getter / setter:
public string Vyber_ID_K
get
{
return vyber_ID_K;
}
set
{
vyber_ID_K = value
}
您需要表单2中的表单1和表单3中的表单2的引用。因此您可以访问 每个表格。
你不能使用字符串作为引用参数,因为它是一个不可变的类。 String C#
答案 1 :(得分:0)
通过构造函数
传递参数真的很奇怪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;
}
然后,将任何内容传递给来自form3
的{{1}}以同样的方式工作
form2
答案 2 :(得分:0)
所以这里的问题是,当你构建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
。如果有其他调用者想要使用它,他们可以提供自己的代理。如果有一个开发人员处理每个表单的编码,他们不需要将每个表单的所有内部细节彼此通信,他们可以只处理该委托的传递,然后能够将调用者/被调用者视为一个黑盒子。