从另一个窗体访问字符串

本文关键字:字符串 访问 窗体 另一个 | 更新日期: 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:我的步骤

  1. 点击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中的按钮2

    public Func vyberIDKGeter;private void button1_Click(对象发送方,EventArgs e){nova_platba b=新的nova_pplatba("novy");b.vyberIDKGeter();b.放映();b.闭合+=klient_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);
    

从另一个窗体访问字符串

所以这里的问题是,当您构建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不需要知道任何关于Form1Form2的信息。如果有其他调用者想要使用它,他们可以提供自己的委托。如果有开发人员处理每个表单的编码,他们不需要相互交流每个表单的所有内部细节,他们只需要处理此委托的传递,然后就可以将调用者/被调用者视为黑盒。

您必须围绕字符串创建一个公共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;
  }

然后,从form2form3传递任何内容的工作方式与相同

form3 f = new form3( this.vyber_IDK );