从另一个表单访问字符串

时间:2013-08-26 19:09:04

标签: c# winforms

你好我在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. 按钮单击表单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

    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;   }

  3. 在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 个答案:

答案 0 :(得分:0)

你必须在字符串周围创建一个公共getter / setter:

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

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

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

答案 1 :(得分: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;
  }

然后,将任何内容传递给来自form3的{​​{1}}以同样的方式工作

form2

答案 2 :(得分:0)

所以这里的问题是,当你构建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。如果有其他调用者想要使用它,他们可以提供自己的代理。如果有一个开发人员处理每个表单的编码,他们不需要将每个表单的所有内部细节彼此通信,他们可以只处理该委托的传递,然后能够将调用者/被调用者视为一个黑盒子。