我已经研究了很多如何使这个工作,但我无法解决问题,我也不喜欢一些研究方法,因为我相信它浪费了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上添加行。
非常感谢您对此问题的任何帮助。我被困在这一段时间了。
答案 0 :(得分:1)
只需在form2上创建公共属性:
public string passtext
;
就是这样做:
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");