从另一个窗体访问字符串

您好我有form1和form1 datagridview我打开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访问vyber_ID_K in form 3 ,它是如何完成的? 我试图public string vyber_ID_K in form2 and pass it similary to form3 but I get null设置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);
    

  • 所以这里的问题是,当你构建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
    }
    

    您需要参考Form 2中的Form 1和Form 3中的Form 2,因此您可以访问每个Form。

    你不能使用一个字符串作为引用参数,因为它是一个不可变的类。 字符串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一样的

    form3 f = new form3( this.vyber_IDK );
    
    链接地址: http://www.djcxy.com/p/71161.html

    上一篇: Accessing string from another Form

    下一篇: datagridview in form1 automatic refresh after insert from form2