从另一个表单访问字符串

Posted

技术标签:

【中文标题】从另一个表单访问字符串【英文标题】:Accessing string from another Form 【发布时间】:2013-08-29 08:43:44 【问题描述】:

您好,我在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:

    Form 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中点击按钮

    公共函数 vyberIDKGetter; 私人无效按钮1_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);
    

【问题讨论】:

这听起来更像是您需要重新考虑您的布局,但bendeg 的回答是一种方法 【参考方案1】:

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

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

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

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

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

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

【讨论】:

您好,非常感谢您的回答。我是安静的初学者,请问“何时构造该表单”是什么意思?我应该放入 form2_Load 事件中还是在单击按钮时打开 Form2 ?所以一步一步就像 1) 打开 form2 a = new form2 a.Func 2. (我不确定在哪里定义 Func ) 3. 我应该在 Form3 Func @Marek 你应该在Form1 中定义它,正如我所展示的。然后,您应该通过它的构造函数将它传递给Form2,或者在构造之后将其分配给一个属性。然后,您应该让第二个表格在同一个庄园中传递给第三个表格。那时Form3Func&lt;string&gt; 对象作为字段/属性,可以通过直接访问该字段/属性来调用它;没有必要使用局部变量。 非常感谢您的好意,请检查我的编辑吗? @Marek Func&lt;string&gt; 是对象的类型,就像string 是字符串对象的类型一样。您需要创建一个具有某个名称的属性,该名称具有您设置的类型,或者为该类型的表单构造函数创建一个参数,在其中传递值。a.Func&lt;string&gt; 没有意义;您需要指定您创建的一些属性,而不是类型。 (为此,您必须先创建一个属性。) 抱歉打扰了,如果正确通过,请检查我的第一步吗?我仍然通过null。不知道为什么。非常感谢您。【参考方案2】:

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

public string Vyber_ID_K 
get

    return vyber_ID_K;

set

    vyber_ID_K  = value

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

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

【讨论】:

【参考方案3】:

通过构造函数传递参数真的很奇怪

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;
  

然后,将任何东西从form2 传递给form3 的工作方式相同

form3 f = new form3( this.vyber_IDK );

【讨论】:

他在那里做的事情没有用。构建 form2 时未填充网格视图。他希望Form3 能够在数据网格创建后的某个时间点获得它的值。他当前的代码只是传递一个空字符串,因为尚未填充数据网格。 @Servy:你写的很有道理,但我重读了他的帖子,并没有发现任何关于未来访问的线索。相反,他在数据已经可用(第二行)时创建表单(第一行)。我认为这需要由 OP 澄清。

以上是关于从另一个表单访问字符串的主要内容,如果未能解决你的问题,请参考以下文章

从另一个类访问字符串

访问表单,从另一个表中搜索记录并插入当前表单中的字段

访问VBA:从另一个表单获取复选框的价值

如何将自动填充的表单记录(从另一条记录创建)添加到访问表中?

访问:使用从另一个查询中选择的 DAO.recordset 运行查询

从另一个类中的 UITextField 访问文本