2015-08-24 48 views
3

任何幫助表示讚賞不能訪問複選框從另一種形式

基本上我無法訪問選項卡上的checkedlistbox。 我有選項卡1 a checkedlistbox形式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 I能夠訪問標籤控制,我可以訪問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;  
    } 
+0

這兩個複選框都是公開的 – Deke

+0

你在哪裏初始化'QCForm'? –

+0

public partial class frmResults:Form { public frmNSTDBQC QCForm = new frmNSTDBQC(); – Deke

回答

1

獲取的Form1相同的實例,其中以這種方式

Form2添加複選框是:

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(); 
+0

@Deke我在這裏添加了答案,這裏「Form1」表示你的第一個表單有複選框,Form2表示你正在訪問列表的表單。 –

+0

謝謝X_TECH。這就是我所想到的。我想創造一個參考,而不是一個新的,但我coudnt相當得到它。我會嘗試這個代碼 – Deke

+0

@X_TECH沒有訪問 - 這..不知道爲什麼 – Deke

0

如果您有兩種形式公開的,你希望他們進行互動,如果您創建第一Form1上,然後窗體2,可以使窗體2能夠看到在Form1中創建的變化Form2中的CheckedListBox屬性並將其初始化爲Form1內部的CheckedListBox對象。 請注意,在創建CheckedListBox並初始化其內容後設置引用。

然而,這是一個「原始」的方式來進行。一種更好的方式進行。將具有在Form1

(E.g. List<Yourobject>) 

作爲CheckedListBox的數據源,在列表框結合到屬性表示所述數據對象的列表,使得在數據的經過屬性設置/你的列表框復位,然後使用您在窗體2的屬性設置當打開它,你在Form1初始化後,一個

List<YourObject> 

收集共享只是這兩種形式之間的數據列表。

請記住,YourObject類必須在Checked屬性上實現PropertyChanged以通知更改,並且如果是這種情況,最好使用BindingList而不僅僅是List集合對象,因爲BindingList將事件實現爲通知UI其內容已更改,如ObservableCollection對WPF所做的更改。 HTH