我想在第一个表单上的dataGridView中选择行以在另一个表单上用该值填充comboBox时设置comboBox.SelectedValue,
在我的加载事件我有第二种形式comboBox.DataSource,DisplayMember,ValueMember正确设置它,但是当我设置了selectedValue在第一什么也没有发生。当我以一种形式进行操作时,一切都很好
comboBox.DataSource
DisplayMember
ValueMember
Form与其他C#类一样,Windows Forms中的类也是一个类。表单之间的通信方式与类相同。您可以在类之间进行通信时考虑以下选项:
Form
从第一个表格操纵第二个表格
您可以将适当的参数添加到第二种形式的构造函数中。然后,您可以在创建第二种形式的实例时将值传递给构造函数。在第二种形式中,将参数存储在成员字段中,并在需要时使用它们。
您可以在第二种形式中创建公共属性或方法,并在创建第二种形式的实例后设置这些属性。这样,您可以在第二种形式需要时使用它们。创建第二个表单时,此选项不限于传递值。您甚至可以在执行second的过程中使用该属性Form。这对于从中获取价值也很有用。
作为另一种选择,您可以将要操纵它的控件公开,这样您就可以从其他形式访问它。建议使用一种方法来执行此操作。
从第二种形式操纵第一种形式
您可以以第一种形式创建一个公共方法或属性,并将第一种形式的实例传递给第二种形式。然后在传递的实例上使用该方法/属性,就可以操纵第一种形式。
您可以创建第二种形式的事件,并在创建第二种形式的实例后,以第一种形式订阅该事件,并将用于更改该形式的代码放入处理程序中。然后以第二种形式引发事件就足够了。
您可以Action在第二种形式中定义类型或其他委托类型的公共属性,然后在创建第二种形式的实例后,使用自定义操作分配该属性。然后在第二种形式中,当您需要操纵第一种形式时就足以调用该动作。
Action
同样在这里,您可以使第一个窗体的控件公开,然后,如果将第一个窗体的实例传递给第二个窗体,则可以操纵该控件。建议使用其他解决方案。这就像创建公共属性或方法一样,但是在控件上执行特定任务的方法比公开整个控件更好。但是您有时可能需要此解决方案。
以下是有关上述解决方案的一些有用示例。
Example1-使用第二个Form的构造函数
当您需要在创建第二个表单时将一些数据传递给第二个表单时,请使用此示例。
public partial class Form2 : Form { int selectedValue; public Form2(int value) { InitializeComponent(); selectedValue = value; } private void Form2_Load(object sender, EventArgs e) { //Load data this.comboBox1.DataSource = new MyDbContext().Categories.ToList(); this.comboBox1.DisplayMember = "Name"; this.comboBox1.ValueMember = "Id"; this.comboBox1.SelectedValue = selectedValue; } }
然后以您的第一种形式,Form2在创建新实例的值时将其传递给就足够了:
Form2
var value = 2; // Or get it from grid var f = new Form2(value); f.ShowDialog();
例2-使用公共财产或第二种形式的方法
当您需要将一些数据传递到第二个表单时,或者在创建第二个表单时甚至在创建第二个表单之后,都可以使用此示例。
public partial class Form2 : Form { public Form2() { InitializeComponent(); } public string SomeValue { get { return textBox1.Text;} set { textBox1.Text = value;} } }
然后在第一种形式中,足以Form2在需要时,创建之后Form2或需要设置textBox1on 值时将值传递给Form2:
textBox1
var f = new Form2(); //value is not needed here f.SomeValue = "some value"; f.Show(); //... f.SomeValue = "some other value";
示例3-将第二种形式的控件公开
当您需要在第二个窗体上,在创建第二个窗体时甚至在创建第二个窗体之后更改控件的属性时,请使用此示例。最好使用公共属性或方法,而不要公开整个控件属性。
在Form设计器中的控件中,选择控件,然后在“属性”窗口中将属性设置Modifiers为Public。还要确保该GenerateMember属性为true。然后,您可以简单地从外部使用其名称访问此控件Form。
Modifiers
Public
GenerateMember
true
var f = new Form2(); f.textBox1= "some value";
示例4-在第一个表单中创建公共方法或属性,并将第一个表单的实例传递给第二个表单的构造函数
当您需要Form先从第二个表单进行更改时,请使用此示例。
在您的中Form1,创建一个接受某些参数的方法的属性,并将逻辑放入其中:
Form1
public void ChangeTextBox1Text(string text) { this.textBox1.Text = text; }
然后创建一个构造函数,在Form2该构造函数中接受类型的参数Form1并将传递的值保留在成员字段中,并在需要时使用它:
Form1 form1; public Form2 (Form1 f) { InitializeComponent(); form1 = f; } private void button1_Click(object sender, EventArgs e) { form1.ChangeTextBox1Text("Some Value"); }
现在,在创建时,Form2您应该将实例传递Form1给它:
var f = new Form2(this); f.Show();
示例5-在第一个表单中使用第二个表单的事件
看一下这篇文章。它是关于表单和控件之间的通信,但也适用于表单之间的通信。
示例6-以第二种形式注入动作
示例7-将第一个表单的控件公开
在此解决方案中,您需要公开第一种形式的控件,例如示例3。然后像示例4一样,将第一种形式的实例传递给第二种形式,并将其保留在字段中,并在需要时使用它。首选使用公共方法或属性。
Form1 form1; public Form2 (Form1 f) { InitializeComponent(); form1 = f; } private void button1_Click(object sender, EventArgs e) { form1.textBox1.Text = "Some Value"; }
在创建时,Form2您应该将实例传递Form1给它: