你好,我在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);
3 回答
所以这里的问题是你想要的值不会构造
Form2
,甚至Form3
. 它需要有一些方法可以在将来的某个时间访问数据 . 我们可以通过利用代表来获得这种行为 .而不是传递
string
到Form2
,当构造该形式时(因为我们不知道该字符串将是什么)传递Func<string>
. 该对象将是一种方法,在调用时,将提供表示所需值的字符串 .Form1
可以像这样定义:然后在
Form3
中,当它保持传递的函数时,它可以通过简单地调用该委托来获取字符串:这种解决问题的方法特别具有冒险性,因为
Form3
不需要了解Form1
或Form2
. 如果有其他调用者想要使用它,他们可以提供自己的代理 . 如果有一个开发人员处理每个表单的编码,他们不需要将每个表单的所有内部细节彼此通信,他们可以只处理该委托的传递,然后能够将调用者/被调用者视为黑匣子 .你必须围绕字符串创建一个公共getter / setter:
您需要表格2中的表格1和表格3中的表格2的参考 . 因此,您可以访问每个表格 .
你不能使用字符串作为引用参数,因为它是一个不可变的类 . String C#
通过构造函数传递参数真的很奇怪
并在同一时间通过属性传递另一个参数
你为什么不通过构造函数传递所有参数?
并在Form2中
然后,从
form2
传递任何东西到form3
以相同的方式工作