我知道这看起来很傻,但是我在winforms
中遇到了一个奇怪的问题。我有一个Windows应用程序,在完成一组特定的操作后,我想填充一个 Checked ComboBox 。我使用两个类进行此操作。我想将数组从帮助程序类复制到表单类。调用AddArrayItems
方法时将复制数组。但是,当我看到窗体中的ComboBox时,它为null。在使用watch变量进行调试之后,我知道问题是将数组复制到Form1数组之后,一旦控件返回到调用者,数组项将被删除。我尝试复制自己的内容,虽然不完全相同,但仍然与我的工作类似。
我的代码如下:
using System;
using System.Windows.Forms;
namespace DemoApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string[] cboxAr;
public void AddCmboBoxItems(string[] cbArry)
{
cboxAr = new string[cbArry.Length];
Array.Copy(cbArry, 0, cboxAr, 0, cbArry.Length);
//cbArry.CopyTo(cboxAr, 0);
//foreach (string s in cboxAr)
//comboBox1.Items.Add(s);
comboBox1.Show();
}
private void button1_Click(object sender, EventArgs e)
{
HelperClass.DoSomething();
}
}
public class HelperClass
{
public HelperClass()
{
}
public void HelperMethod()
{
SomeMethod();
}
private void SomeMethod()
{
string[] partnrName = new string[5] { "str1", "str2", "str3", "str4", "str5"};
Form1 f = new Form1();
f.AddCmboBoxItems(partnrName);
}
public static void DoSomething()
{
new HelperClass().HelperMethod();
}
}
}
我不明白这里到底是什么问题。任何人都可以向正确的方向推动我。预先感谢。
答案 0 :(得分:1)
您永远不会在修改表单控件后显示该表单:
Form1 f = new Form1();
f.AddCmboBoxItems(partnrName);
但是您是从现有的 表单中调用的:
private void button1_Click(object sender, EventArgs e)
{
HelperClass.DoSomething();
}
想必您要修改那个表单上的控件?然后,您需要对该表格的引用。将一个传递给方法:
private void button1_Click(object sender, EventArgs e)
{
HelperClass.DoSomething(this);
}
并在方法定义中接受它:
public static void DoSomething(Form1 form)
{
new HelperClass().HelperMethod(form);
}
如此,直到需要使用它为止。 (旁注:您在这里发生了很多 奇怪的间接调用,它们似乎是静态方法和实例方法以及类的随机混合。您可以简化很多操作,这将减少代码更改。)< / p>
最终,SomeMethod
需要修改表单的实例:
private void SomeMethod(Form1 form)
{
string[] partnrName = new string[5] { "str1", "str2", "str3", "str4", "str5"};
form.AddCmboBoxItems(partnrName);
}
为说明整体观点,请考虑一个类比...
一辆汽车从装配线滑下。您打开后备箱,然后将手提箱放进去。片刻之后,另一辆车从同一条装配线滑落。它在各个方面都与第一辆汽车相同。当您打开第二辆汽车的后备箱时,您是否希望在其中找到行李箱?
Form
是与其他对象一样的对象。对一个对象的一个实例所做的更改不会反映在同一对象的其他实例中。每个实例保持其自己的状态。为了修改特定实例,您需要对该实例的引用。