无法从另一个表单访问复选框

本文关键字:访问 复选框 表单 另一个 | 更新日期: 2023-09-27 18:09:45

感谢您的帮助

基本上我有麻烦访问一个选项卡上的复选框。我在表单1的表1上有一个复选框。我想把这个复选框传递给表单2,并将结果放在表单2的列表框中

Form1

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();
    }

形式2

    private frmNSTDBQC QCForm;
    public frmResults(frmNSTDBQC qcForm)
    {
        InitializeComponent();
        QCForm = qcForm;    
    }

无法从另一个表单访问复选框

获取与Form1相同的实例,您以这种方式添加复选框

Form2 is:

private Form1 form1;
public Form2(Form1 form)
{
    form1 = form;
}
// now you can use form1 as object
现在显示Form2Form1
var form2 = new Form(this); //pass instance
form2.ShowDialog();

如果两个窗体都打开并且你想让它们交互,如果你先创建Form1,然后创建Form2,你可以使Form2能够看到Form1的变化,在Form2中创建一个CheckedListBox属性并将其初始化为Form1中的CheckedListBox对象。注意,引用是在创建checklistbox并初始化其内容之后设置的。

然而,这是一个有点"原始"的方式进行。一个更好的方法是使用一个对象列表来表示Form1

中的数据。
(E.g. List<Yourobject>)

作为CheckedListBox的数据源,绑定到列表框中的属性,以便列表框设置/重置数据中的Checked属性,然后使用

在两个表单之间共享该数据列表
List<YourObject>

集合,在Form1中初始化后打开它。

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