这可能是一个愚蠢的问题,但我真的不知道如何处理它。我的主表单默认类如下所示:
public partial class MainForm : Form
{
public MainForm(bool version)
{
InitializeComponent();
if(version == true)
{
items_checkedListBox.Items.Add("aa".ToString());
}
else
{
Controls.Remove(items_checkedListBox);
}
}
}
默认情况下,我的WinForm
应用程序开始时Application.Run(new MainForm(true));
一切正常。但是我想从另一个类更新checkedListBox,为此我需要实例化我的主表单对象并调用新对象,MainForm mainForm = new MainForm(false);
但问题是checkedList控件仍然存在,即使Controls.Remove(items_checkedListBox);
被执行。
当我实例化主窗体时,如何操作另一个类的控件?:(
通过做这个:
MainForm mainForm = new MainForm(false);
您创建该类型的第二个新表单MainForm
并删除它的 control items_checkedListBox
,但这不是您在MainForm
. 此外,您没有看到您创建的第二个表单,因为您没有让它显示出来,所以不要怀疑您没有看到任何事情发生,例如删除第二个表单上的其他控件。
因此,为了操作您的控件,items_checkedListBox
您需要将此控件的引用传递给您希望操作它的类。
想象一下,您将拥有另一种表单(即您的其他类),用于操作您的控件items_checkedListBox
。
public partial class FmManipulateControl : Form
{
public FmManipulateControl()
{
InitializeComponent();
}
}
为了能够做到这一点,将此控件的引用作为方法参数传递给构造函数:
public FmManipulateControl(Control myControl) { ... }
为了能够操作它,我们将控件的引用存储在一个字段中,例如按钮单击事件可以访问控件以更改/删除/...它。
Control controlToChange;
public FmManipulateControl(Control myControl)
{
InitializeComponent();
controlToChange = myControl;
}
假设我们绑定到表单中的按钮单击事件FmManipulateControl
:
private void button1_Click(object sender, EventArgs e)
{
//diposes the control, so it does not exist anymore, but you can apply
//any change to the control you wish to do
controlToChange.Dispose();
}
现在您要做的就是创建一个实例FmManipulateControl
并将控件的引用传递给它items_checkedListBox
并显示新的表单对象。
FmManipulateControl fmChangeAControl = new FmManipulateControl( items_checkedListBox);
fmChangeAControl.Show();
关于引用类型的进一步说明:
我正在谈论传递控件的引用,我想您可能想知道我的意思。我建议您阅读有关值和引用类型的内容。
我尽量保持简短。
想象一个值类型直接包含值本身:例如一个int
. 对象直接包含值。
int a = 3;
a
包含值3
。
现在让我们看看我们的控件。此 ListBox 控件items_checkedListBox
不包含我们的对象控件,而是对其在内存中的位置的引用。这就是为什么它被称为引用类型。
所以当我们items_checkedListBox
作为方法参数传递时,我们传递的不是对象,而是我们items_checkedListBox
控件的内存位置。所以我们指向同一个对象,所以我们可以操纵它。
笔记:
方法参数只是输入对象的副本,所以当我们这样做时:
FmManipulateControl fmChangeAControl = new FmManipulateControl( items_checkedListBox);
在我们的表单中,fmChangeAControl
我们得到了一个 object( myControl
),它是 的副本items_checkedListBox
。但是由于我们没有传递对象,而是一个引用,不管我们有没有副本,我们仍然指向同一个内存位置,所以我们仍然操作同一个对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句