2012-11-21 57 views
0

我有兩種形式:form1和form2。如何訪問其他表單中的選中項目?

Form1有button1listbox1,窗口2包含button2checkedlistbox1

當點擊button1必須打開form2並檢查項目checkedlistbox1。然後點擊button2,所以form2關閉,listbox1必須顯示從checkedlistbox1檢查的項目。但問題是我無法複製檢查項目從checkedlistbox1listbox1。我該怎麼做,請幫助。

回答

3

因此,我們將開始將此屬性添加到Form2。這將是通信的肉:

public IEnumerable<string> CheckedItems 
{ 
    get 
    { 
     //If the items aren't strings `Cast` them to the appropirate type and 
     //optionally use `Select` to convert them to what you want to expose publicly. 
     return checkedListBox1.SelectedItems 
      .OfType<string>(); 
    } 
    set 
    { 
     var itemsToSelect = new HashSet<string>(value); 

     for (int i = 0; i < checkedListBox1.Items.Count; i++) 
     { 
      checkedListBox1.SetSelected(i, 
       itemsToSelect.Contains(checkedListBox1.Items[i])); 
     } 
    } 
} 

這將讓我們設置所選的項目(可以自由使用比string的項目值以外的內容)從從這種形式的另一種形式,或者獲得所選項目。

然後在Form1,我們可以這樣做:

private void button1_Click(object sender, EventArgs e) 
{ 
    Form2 other = new Form2(); 
    other.CheckedItems = listBox1.SelectedItems.OfType<string>(); 
    other.FormClosed += (_, args) => setSelectedListboxItems(other.CheckedItems); 
    other.Show(); 
} 

private void setSelectedListboxItems(IEnumerable<string> enumerable) 
{ 
    var itemsToSelect = new HashSet<string>(enumerable); 
    for (int i = 0; i < listBox1.Items.Count; i++) 
    { 
     listBox1.SetSelected(i , itemsToSelect.Contains(listBox1.Items[i])); 
    } 
} 

當我們點擊我們創建第二個表格的一個實例的按鈕,設置它的選擇指標,一個處理程序添加到FormClosed事件來更新我們的列表框新的選擇,然後顯示錶單。你會注意到這個方法的實現方法設置ListBox項目的模式與CheckedItemsset方法完全相同。如果你發現自己在做這個事情,很多人都會考慮將其重構爲一種更一般的方法。

+0

@lazyberezovsky請不要編輯其他用戶答案中的代碼,只是遵循您習慣的編碼慣例。如果出現問題,那就不一樣了,但僅僅使用您喜歡的命名約定進行編輯並不是建議編輯的預期目的。 – Servy

+0

我以爲你有一個錯字,因爲'_'是我以前從未見過的名字 –

+0

@lazyberezovsky下劃線'_'是C#中變量的完全有效的標識符。按照慣例,它被用來表示lambda的一個未使用的參數。只是爲了確保它與代表的簽名相匹配。如果我真的使用它(我永遠不會,因爲我已經有一個強類型變量代表另一個形式),我會給它一個不同的名稱。 – Servy

相關問題