无法从另一个窗体访问复选框

3

非常感谢您的帮助。

基本上我遇到了访问选中列表框的问题。

我在表格1的选项卡1上有一个选中列表框。我想将此复选框传递到表格2并将结果放入表格2上的列表框中。

表格1

public static void ShowResults(string strRoutine, string strCaption)
{
    ResultsForm.Routine = strRoutine;
    ResultsForm.Title = strCaption;

    strXMLFileName = xmlDocConfig.SelectSingleNode("config/routine[@key='" + strRoutine + "']/outputfname").Attributes.GetNamedItem("value").Value;

    strXMLFileName = clsUtilities.ReplacePathWildcards(strXMLFileName);

    strXMLFileName = clsUtilities.ReplacePathWildcards(frmNSTDBQC.xmlDocConfig.SelectSingleNode("config/routine[@key='G']/outputfname").Attributes.GetNamedItem("value").Value) + "\\" + strXMLFileName;

    ResultsForm.DisplayFile = strXMLFileName;
    ResultsForm.ShowDialog();
}

在表单2中,我可以访问选项卡控件,可以使用QCForms.tcTabs.SelectedTab.Text访问正确的结果,但是QCForm.chkLstLines.Items.Count显示为0,即使我已经勾选了10个项目。

表单2

public void frmResults_Load(object sender, EventArgs e)      
{
    int i = 0;
    this.Text = "Results - " + this.Title;

    switch (QCForm.tcTabs.SelectedTab.Text)
    {
        case "Line Checks":
            i = 0;                    
            while (i < QCForm.chkLstLines.Items.Count)
            {
                if ( QCForm.chkLstLines.GetItemChecked(i))
                {
                    lstFeatures.Items.Add(QCForm.chkLstLines.Items[i].ToString()); // VB6.GetItemString(QCForm.chkLstLines, i));
                }
                i++;
            }
    }
}

编辑

表单 1

    public static void ShowResults(string strRoutine, string strCaption)
    {
        var ResultsForm = new Form(this);

        //ResultsForm.Routine = strRoutine;
        //ResultsForm.Title = strCaption;

        strXMLFileName = xmlDocConfig.SelectSingleNode("config/routine[@key='" + strRoutine + "']/outputfname").Attributes.GetNamedItem("value").Value;

            strXMLFileName = clsUtilities.ReplacePathWildcards(strXMLFileName);

            strXMLFileName = clsUtilities.ReplacePathWildcards(frmNSTDBQC.xmlDocConfig.SelectSingleNode("config/routine[@key='G']/outputfname").Attributes.GetNamedItem("value").Value) + "\\" + strXMLFileName;

            //ResultsForm.DisplayFile = strXMLFileName;

            ResultsForm.ShowDialog();
    }

表格二

    private frmNSTDBQC QCForm;

    public frmResults(frmNSTDBQC qcForm)
    {
        InitializeComponent();

        QCForm = qcForm;    
    }

两个复选框都是公共的。 - Deke
你在哪里初始化 QCForm - NASSER
公共部分类 frmResults:Form { public frmNSTDBQC QCForm = new frmNSTDBQC(); - Deke
不要创建新实例,因为它确实有所有项目都未选中,通过构造函数传递相同的实例。 - NASSER
2个回答

1

您可以通过以下方式获取添加复选框的Form1实例:

Form2是:

private Form1 form1;
public Form2(Form1 form)
{
    form1 = form;
}
// now you can use form1 as object

现在从Form1显示Form2

var form2 = new Form(this); //pass instance
form2.ShowDialog();

@X_TECH 没有访问权限 - 不确定为什么 - Deke
@Deke 现在,你遇到了什么问题? - NASSER
关键字“this”不是有效的静态属性。但是当我删除static时,我得到了Windows表单不包含一个参数的构造函数。 - Deke
@Deke,你能把“ShowResults”声明为非静态的吗? - NASSER
是的,但是我得到了“我得到的Windows窗体不包含一个带有一个参数的构造函数”的错误。 - Deke
显示剩余4条评论

0

如果您同时打开了两个窗体并且希望它们进行交互,那么您可以先创建Form1,然后再创建Form2。在Form2中创建一个CheckedListBox属性,并将其初始化为位于Form1内部的CheckedListBox对象,以使Form2能够看到Form1中的更改。

请注意,在创建CheckedListBox并初始化其内容之后,设置引用。

然而,这种方法有点“原始”。更好的方法是在Form1中拥有表示数据的对象列表。

(E.g. List<Yourobject>)

作为CheckedListBox的数据源,绑定到列表框中的属性,以便通过您的列表框设置/重置数据中的Checked属性,然后使用一个方法在两个窗体之间共享这个数据列表。
List<YourObject>

在初始化Form1后,在Form2中打开它时,将集合设置为Form2属性的一部分。

请记住,YourObject类必须实现对Checked属性的PropertyChanged以通知更改。如果是这种情况,最好使用BindingList而不仅仅是List集合对象,因为BindingList实现了事件以通知UI其内容已更改,就像ObservableCollection为WPF所做的那样。 希望有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接