0

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

我有两种形式:Form1(有 DataGridView(修改器:Public),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)

这也不起作用,那么我该如何解决呢?我正在尝试在 Form1 上添加来自 Form2 的行。

非常感谢您对此问题的任何帮助。我已经坚持了一段时间。

4

6 回答 6

1

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

public string passtext;

在您的 Form1 上执行以下操作:

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

在你 Form2 上:

试试这个进行测试:

MessageBox.Show(passtext);

问候

于 2012-07-19T00:13:44.527 回答
1

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

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

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

表格 1(父母)

form2.ExampleText = "fred";

一般规则是只公开您需要的最少量的细节。回到 VB 中,“hack”是公开控件,以便您可以通过设置访问器属性来公开整个文本框。您可以在 C# 中执行此操作,但非常不建议这样做。

2)对于子父关系:我能建议的最简洁的选择是采用事件通知模型。孩子公开了一个事件,该事件将提供详细信息供聆听的父母使用。父窗体捕获事件并执行自己的更新。

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

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... */ );

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

于 2012-07-19T00:22:08.813 回答
1

Form 类有一个 Form 类型的 Owner 属性和一个设置该属性的 show 方法重载。这允许您将父表单的引用传递给子表单。

您必须将调用更改为 show 如下所示:

form2.Show(this);

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

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

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

于 2012-07-19T00:37:50.637 回答
0

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

Form2 form = new Form2(text);

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

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

问候

于 2012-07-19T00:08:41.907 回答
0

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

于 2012-07-19T00:20:37.277 回答
0

但这有点乱这里是ùy的建议!

创建一个类以将这项工作与 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");
于 2012-07-19T01:15:42.613 回答