我有两张表格。说 FormA , FormB 。
从FormA我使用了FormB 的 frmB.Show();
在FormB中,我有两个文本框和一个组合框控件。 假设用户在这两个文本框中输入了一些数据,并从Form2中的组合框中选择了一个项目,然后单击确定按钮。
点击后我想要那些文本框用户输入的值,组合框选择的项目值回到 FormA 。
我如何使用C#实现这一目标。
答案 0 :(得分:6)
我接近了简单的方式..点缀......
在表单类中创建公共变量,即
public string passVariable1 =“”;
如果您有文本框转到属性,然后单击闪电并双击空TextChanged事件处理程序。这将在代码中创建一个代码片段,当文本框的内容发生变化时执行该代码片段。在此代码块中,将文本框的内容分配给相应的公共变量。
即。我的公共变量是
public string issue =“”;
private void txtIssue_TextChanged(object sender,EventArgs e) { issue = txtIssue.Text; }
添加按钮并为此按钮创建单击事件(只需双击设计窗格中的按钮)。在点击事件代码块中,将dilog结果设置为ok并隐藏
this.DialogResult = DialogResult.OK;
this.Hide();
在父窗口代码中检查对话框结果并从子表单的公共变量中获取表单数据
if (f.ShowDialog() == DialogResult.OK) { string b = f.issue; string e = f.year; string f = f.month; };
答案 1 :(得分:4)
在您描述的场景中,我可能会调用frmB.ShowDialog()
而不是frmB.Show()
。
// Inside FormA open frmB as a modal dialog waiting for
// OK or Cancel result using the following statement
if (frmB.ShowDialog() == DialogResult.OK)
{
// Retrieve selected values from frmB here (while frmB is still not disposed)
}
ShowDialog()
的好处在于:
注意:在设计frmB时,您必须将OK按钮控件的DialogResult
属性设置为DialogResult.OK
,以便在按下此按钮时表单返回正确的DialogResult(或者也可以在OK按钮的Click事件处理程序中设置this.DialogResult
答案 2 :(得分:4)
您可以在FormA上订阅的FormB上创建一个EventHandler。此外,向FormB添加几个公共属性,表示您希望FormA能够使用的数据。然后,当FormB触发事件时,FormA将知道刷新他的数据。
注意:此示例中的关键原则是实现EventHandler(您可以创建自己的事件处理程序类型),当数据准备好刷新/查看/等时,它会通知FormA。希望这个例子可以让你看到如何为你的特定情况实现一个事件处理程序。
示例:
FormA -
public partial class FormA : Form
{
//FormA has a private instance of FormB
private FormB formB = null;
public FormA()
{
InitializeComponent();
}
void formB_OnDataAvailable(object sender, EventArgs e)
{
//Event handler for when FormB fires off the event
this.label1.Text = string.Format("Text1: {0}\r\nText2: {1}",
formB.Text1, formB.Text2);
}
private void InitializeFormB()
{
this.formB = new FormB();
//FormA subscribes to FormB's event
formB.OnDataAvailable += new EventHandler(formB_OnDataAvailable);
}
private void button1_Click(object sender, EventArgs e)
{
this.InitializeFormB();
formB.Show();
}
}
FormB -
public partial class FormB : Form
{
//Event that fires when data is available
public event EventHandler OnDataAvailable;
//Properties that expose FormB's data
public string Text1 { get; private set; }
public string Text2 { get; private set; }
public FormB()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//Set the exposed properties, then fire off the event.
this.Text1 = this.textBox1.Text;
this.Text2 = this.textBox2.Text;
if (OnDataAvailable != null)
OnDataAvailable(this, EventArgs.Empty);
}
}
答案 3 :(得分:3)
或者您可以将FormA中的对象传递给FormB,并将其属性绑定到FormB中的控件。如果您希望在单击“确定”按钮时通知FormA,您可以在数据容器类中声明一个事件,在FormA中订阅它并从FormB中激活它。
将DataContainer定义为您定义的一个类
public class DataContainer
{
public event EventHandler AcceptedChanges;
protected virtual void OnAcceptedChanges()
{
if ((this.AcceptedChanges != null))
{
this.AcceptedChanges(this, EventArgs.Empty);
}
}
public void AcceptChanges()
{
this.OnAcceptedChanges();
}
public string Text1 { get; set; }
public string Text2 { get; set; }
}
FormA中的:
private void button4_Click(object sender, EventArgs e)
{
DataContainer data = new DataContainer();
data.Text1 = "text1";
data.Text1 = "text2";
Form2 frm = new Form2();
frm.Data = new DataContainer();
data.AcceptedChanges += new EventHandler(data_AcceptedChanges);
frm.Show();
}
void data_AcceptedChanges(object sender, EventArgs e)
{
// your code here
}
并在FormB中:
public DataContainer Data { get; set; }
private void Form2_Load(object sender, EventArgs e)
{
textBox1.DataBindings.Add(new Binding("Text", Data, "Text1"));
textBox2.DataBindings.Add(new Binding("Text", Data, "Text2"));
}
private void button1_Click(object sender, EventArgs e)
{
Data.AcceptChanges();
}
您还应该在DataContainer类上实现INotifyPropertyChanging和INotifyPropertyChanged,以便与绑定一起使用。
答案 4 :(得分:2)
答案 5 :(得分:1)
一个肮脏但也是最快的解决方案是将这些控件公开。这可以通过在Form2.Decisgner.cs文件中添加单词public来实现。如果FormA具有FormB的成员变量或局部变量,则可以使用以下命令访问控件(例如TextBox1):
frmB.TextBox1.Text
现在也可以在FormB外部访问。
答案 6 :(得分:1)
我遇到了同样的问题,想出了一个与众不同的想法。在我的场景中,我正在为我最小的两个孩子制作一个flashcard程序,我希望能够将提供给父表单的答案(每个新的flashcard问题的新子表单)带回来,以便父表单可以更新多少个左,多少正确,多少不正确等等,而不必向数据库添加值。对于应该简单的事情来说似乎有些过分。我所做的是创建一个每个变量类型3的类。我认为每种类型中的三种对于大多数工作都是足够的。
这是我的新课程的一个例子:
namespace ClassNamespace
{
public class ValueHolder
{
public int intValue1 { get; set; }
public int intValue2 { get; set; }
public int intValue3 { get; set; }
public long longValue1 { get; set; }
.
.
.
}
}
我从父表单创建一个新的ValueHolder(ValueHolder vh;)并将其传递给子表单。在子窗体中,我创建一个新的ValueHolder,然后将其设置为等于子窗体的类构造函数中发送的ValueHolder对象。现在,当按下回车键(给出回答)时,我可以将vh.intValue1设置为等于this.answerBox.text; ...好吧,我必须使用int.tryparse();但是你明白了。然后我只需要从父表单中引用vh.intValue1来获取输入的值。
父母表格:
for (int i = 0; i < limit; i++)
{
ValueHolder vh = new ValueHolder();
ChildClass cc = new ChildClass(vh);
MessageBox.Show(vh.intValue1.ToString()); //to test that it works
}
和子形式:
ValueHolder vh;
public ChildClass (ValueHolder vhIncoming)
{
vh = vhIncoming;
}
private void answerBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
vh.intValue1 = 1234;
}
}
这似乎是我的方案最简单的解决方案。我知道这个问题已经过时了,但是想为类似位置的任何人添加此选项。只需将类添加到项目中,根据需要向类中添加更多类型或更多类型,为将来的项目进行重复冲洗。
答案 7 :(得分:0)
如果它在同一页面上,您应该可以直接从控件中读取它,如Textbox1.Text,Textbox2.Text,Combobox.SelectedValue(我猜) 但如果它在不同的页面上使用Session变量,如: Session [“date1”] = TextBox1.Text; Session [“date2”] = TextBox2.Text; Session [“comboValue”] = Combobox.SelectedValue; 并使用它们来填充表单
答案 8 :(得分:0)
这取决于您通常如何设计应用程序。
所有这些都可行,但这完全取决于您希望如何构建应用程序。