因此,我們將開始將此屬性添加到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
項目的模式與CheckedItems
的set
方法完全相同。如果你發現自己在做這個事情,很多人都會考慮將其重構爲一種更一般的方法。
@lazyberezovsky請不要編輯其他用戶答案中的代碼,只是遵循您習慣的編碼慣例。如果出現問題,那就不一樣了,但僅僅使用您喜歡的命名約定進行編輯並不是建議編輯的預期目的。 – Servy
我以爲你有一個錯字,因爲'_'是我以前從未見過的名字 –
@lazyberezovsky下劃線'_'是C#中變量的完全有效的標識符。按照慣例,它被用來表示lambda的一個未使用的參數。只是爲了確保它與代表的簽名相匹配。如果我真的使用它(我永遠不會,因爲我已經有一個強類型變量代表另一個形式),我會給它一個不同的名稱。 – Servy