在不同表单之间传输数据/值 - C#

时间:2012-07-18 23:59:18

标签: c# .net winforms visual-studio-2010 forms

我已经研究了很多如何使这个工作,但我无法解决问题,我也不喜欢一些研究方法,因为我相信它浪费了Ram Space。无论如何,这是问题所在:

我有两种形式: Form1(具有DataGridView(修饰符:公共),TextBox1,Button1) - 父表单 Form2(具有TextBox1,Button1) - 子表单

public partial class Form1 : Form
{
Pivate Void Button1_Click()
TransferText("Text_Example")

Public Void TransferText(string text)
Form2 frm2 = new Form2();
frm2.show()
frm2.textbox1 = text;
}

这显然不起作用,这样做的正确方法是什么?我试图打开Form2,并更改Form2的textbox1值。

在Form2上,我有这段代码:

public partial class Form2 : Form
{
Private Void Button1_click()
RowAdder("Example-Text", "Example2");

Public Void RowAdder(string text1, string text2)
Form frm1 = ?? // What should I write here ?
frm1.DataGridView1.Rows.Add(text1, text2)

这也不起作用,我该如何解决这个问题呢?我试图从Form2上的Form1上添加行。

非常感谢您对此问题的任何帮助。我被困在这一段时间了。

6 个答案:

答案 0 :(得分:1)

只需在form2上创建公共属性:

public string passtext;

你的Form1上的

就是这样做:

   Form2 frm2 =  new Form2(){ passtext= "Text_Example"};
   frm2.Show();

在你的Form2上:

试试这个进行测试:

MessageBox.Show(passtext);

此致

答案 1 :(得分:1)

在视图(表单)之间绑定公共数据是在WPF中得到很好解决的问题,但是我建议使用Winforms方法:

1)对于Parent to Child传输,在子节点上创建一个公共/内部属性,用于处理到所需控件的映射。更好的是,如果要映射多个字段/控件,请使用类似ViewModel的类:包含相关字段的类或结构。 例如:(使用字符串值)在Form2(子)

public string ExampleText
{
   get { return exampleTextControl.Text; }
   set { exampleTextControl.Text = value; }
}

表格1(父母)

form2.ExampleText = "fred";

一般规则只是暴露您需要的最少量的细节。回到VB,“hack”是将控件公开,因此您可以通过设置访问器属性来公开整个文本框。你可以在C#中做到这一点,但是高度不可取。

2)对于Child to Parent关系:我建议的最干净的选择是采用事件通知模型。孩子暴露了一个事件,该事件将为听父母消费提供详细信息。父表单捕获事件并执行自己的更新。

从一个简单的事件args声明开始:

public class ExampleEventArgs : EventArgs
{
   public string Value1 
   {
      get;
      set;
   }
   public string Value2 
   {
      get;
      set;
   }
}

在子表单(Form2)中创建事件声明:

public event EventHandler<ExampleEventArgs> OnRowAdded;

如果您想要通知父母添加一行:

if (OnRowAdded != null)
{
   OnRowAdded(this, new ExampleEventArgs { Value1 = text1, Value2 = text2 });
}

在初始化Form2实例时,在父窗体(Form1)中,为它提供一个方法委托,用于OnRowAdded事件处理程序。这可以是私有方法(VS可以在您添加事件处理程序时为您自动生成此方法),也可以使用Lambda表达式:

var form2 = new Form2();
form2.OnRowAdded += (sender, e) => { this.DataGridView1.Rows.Add(e.Value1, e.Value2); };
// or form2.OnRowAdded += new EventHandler<ExampleEventArgs>( /* generate private method... */ );

*免责声明:以上代码是来自内存的snippits,它可能无法按原样编译,但应该让您了解如何解决问题。

答案 2 :(得分:1)

Form类有一个名为Owner of Type的属性,以及一个设置此属性的show的方法重载。这允许您将父表单的引用传递给子表单。

您必须将您的通话更改为显示如下:

form2.Show(this);

然后在form2中的RowAdder方法中,您必须将所有者强制转换为Form1才能访问datagridview,如下所示:

((Form1)Owner).DataGridView1.Rows.Add(text1, text2);

这将解决从子级到父级表单获取数据的问题。很多人已经回答了从父母那里获取数据的最佳方法,所以我只想说明其他答案。

答案 3 :(得分:0)

您可以更改Form2的ctor以接收字符串作为参数,并在实例化时发送它。

Form2 form = new Form2(text);

在Form2的ctor上,您使用该文本

public Form2(string someText)
{
InitializeComponent();
//...
    this.textbox1.Text = someText;
//...
}

此致

答案 4 :(得分:0)

为了保持良好的类设计,不建议将表单中控件的ID公开给外部。但是,您可以使用C#属性或指定的公共方法来更改控件。

答案 5 :(得分:0)

但这有点凌乱这是一个建议!

创建一个类以将此工作与UI分开:

public class YourController
{
    public DataGridView MyView { get; set; }

    //The method to add a row
    public void AddRowToView(string passedText)
    {
        using (Form2 f2 = new Form2())
        {
            if (f2.ShowDialog() == DialogResult.OK)
            {
                MyView.Rows.Add(passedText, f2.txEdit.Text);
            }
        }
    }
}

在父表单中,调用方法添加行:

//In your parent form, on the click button event :
YourController controller = new YourController() { MyView = view };
controller.AddRowToView("myText");