首页 > 解决方案 > 如何在另一个类的主窗体中编辑一个checkedListBox?

问题描述

这可能是一个愚蠢的问题,但我真的不知道如何处理它。我的主窗体默认类如下所示:

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);被执行。

当我实例化主窗体时,如何从另一个类操作控件?:(

标签: c#winforms

解决方案


通过做这个:

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. 但是由于我们没有传递对象,而是一个引用,所以我们是否有副本并不重要,我们仍然指向同一个内存位置,所以我们仍然操作同一个对象。


推荐阅读