1

您好,我在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. 在表格 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();
    

    }

  2. 在form2中单击按钮

    公共功能 vyberIDKGetter; private void button1_Click(object sender, EventArgs e) { nova_platba b = new nova_platba("novy"); b.vyberIDKGetter(); b.显示();b.Closed += kclient_Closed;}

  3. 在表格 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);
    
4

3 回答 3

0

您必须围绕字符串创建一个公共 getter/setter:

public string Vyber_ID_K 
get
{
    return vyber_ID_K;
}
set
{
    vyber_ID_K  = value
}

您需要来自表格 2 中的表格 1 和表格 3 中的表格 2 的引用。因此您可以访问每个表格。

您不能使用字符串作为引用参数,因为它是一个不可变的类。字符串 C#

于 2013-08-26T19:12:51.670 回答
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;
  }

然后,将任何东西传递给form3fromform2以相同的方式工作

form3 f = new form3( this.vyber_IDK );
于 2013-08-26T19:14:43.140 回答
0

所以这里的问题是,当你构建时,你想要的值还不存在Form2,甚至Form3就此而言。它需要在将来的某个时间点有某种访问数据的方法。我们可以通过利用委托来获得这种行为。

而不是传递 a stringto Form2,当构造该表单时(因为我们还不知道字符串将是什么)传递 a Func<string>。该对象将是一个方法,当被调用时,它将提供一个表示所需值的字符串。 Form1可以这样定义:

Func<string> vyberIDKGetter = 
    () => dataGridView1.CurrentRow.Cells["ID_K"].Value.ToString();

然后,Form3当它持有传递的函数时,它可以通过简单地调用该委托来获取字符串:

Func<string> vyberIDKGetter = [...];
string vyberIDK = vyberIDKGetter();

这种解决问题的方法特别具有冒险精神,因为Form3它不需要了解有关Form1or的任何信息Form2。如果有其他调用者想要使用它,他们可以提供自己的委托。如果有一个开发人员处理每个表单的编码,他们不需要相互传达每个表单的所有内部细节,他们可以只处理这个委托的传递,然后能够将调用者/被调用者视为一个黑匣子。

于 2013-08-26T19:25:09.800 回答