您好,我在form1中有datagridview,通过form1我打开form2,通过form2我打开form3和string named vyber_ID_K
放置在Form1中需要在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)功能 vyberIDKGetter; 私有(private)无效button1_Click(对象发送者,EventArgs e) { nova_platba b = new nova_platba("novy"); b.vyberIDKGetter(); b.显示(); b.Closed += kclient_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
对于这个问题。它需要有某种方式在将来的某个时刻访问数据。我们可以通过利用委托(delegate)来实现这种行为。
而不是传递 string
至Form2
,当构造该表单时(因为我们还不知道字符串是什么)传递 Func<string>
。该对象将是一个方法,在调用时将提供一个表示所需值的字符串。 Form1
可以这样定义:
Func<string> vyberIDKGetter =
() => dataGridView1.CurrentRow.Cells["ID_K"].Value.ToString();
然后在 Form3
当它持有传递的函数时,它可以通过简单地调用该委托(delegate)来获取字符串:
Func<string> vyberIDKGetter = [...];
string vyberIDK = vyberIDKGetter();
这种解决问题的方法特别具有冒险性,因为 Form3
不需要了解任何关于Form1
的信息或Form2
。如果有其他调用者想要使用它,他们可以提供自己的委托(delegate)。如果有开发人员处理每个表单的编码,他们不需要相互传达每个表单的所有内部细节,他们只需处理此委托(delegate)的传递,然后能够将调用者/被调用者视为一个黑匣子。
关于c# - 从另一个表单访问字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18451258/