2009-05-25 116 views
19

我在C#2.0窗體表單應用程序中使用了一個列表框。填充列表框的方法是如何防止ListBox.SelectedIndexChanged事件?

private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList) 
    { 
     lb.DataSource = reportColumnList.ReportColumns; 
     lb.DisplayMember = "ColumnName"; 
     lb.ValueMember = "ColumnName"; 
    } 

然而,當它執行它還會調用列表框的SelectedIndexChanged事件處理程序,即使我沒有在設定上述方法選擇的指數的方法。如何防止爲上述代碼調用SelectedIndexChanged事件處理程序?

我希望僅當用戶在ListBox中進行選擇時纔會調用該事件。或者是否有任何其他事件僅用於用戶使用鼠標單擊選擇列表框項目?

另一方面,即使用戶單擊列表框中的空白區域,SelectedIndexChanged事件也會被觸發。所以我想知道它與MouseClick事件有什麼不同?

+1

在大多數情況下,你不能防止對象引發事件。您只能選擇停止收聽事件通知。 – Gishu 2009-05-25 05:59:25

+0

我的意思是,如果我能以某種方式防止我的代碼的一部分,火災的事件。但是正如我們所看到的,我沒有什麼可以做的,因爲PopulateListBox()中的所有三行都需要:) – 2009-05-25 06:24:46

回答

15

可以填充使用lb.Items.AddRange()的列表框,而不是設置數據源。除了不觸發SelectedIndexChanged之外,這也不會預先選擇第一個項目。

lb.Items.Clear(); 
lb.Items.AddRange(reportColumnList.ReportColumns.ToArray()); 
18

有三種方法可以解決這個問題。

答)不要掛鉤到SelectedIndexChanged事件,直到您調用此方法後。 B)在你的班級中有一個初始設置爲true的私有布爾值。在您的PopulateListBox方法開始時,將其設置爲false,並在最後將其設置爲true。在您的SelectedIndexChanged的事件處理程序中,如果標誌爲false,則返回並不執行任何操作。

C)在你的PopulateListBox方法的開始,從事件解除(this.listbox1.SelectedIndexChanged - = myMethod;),然後在方法完成之前,重新掛鉤該事件。

+0

感謝您的回答。但是,而不是上述步驟,如果我使用MouseClick事件來處理用戶選擇更改會怎麼樣?這樣,只有在用戶選擇發生變化時纔會觸發MouseClick事件,並且在調用PopulateListBox()時不會調用MouseClick事件。在這種情況下使用MouseClick事件有什麼缺點嗎?我測試了它,它工作正常,但我想知道一些我將來可能面臨的隱患,因此。 – 2009-05-25 06:23:24

+0

無法使用MouseClick方法。原因:對於MultiExtended列表框,當點擊鼠標時,即使我選擇了多個項目,選定的索引計數也不會反映該項目。只有在調用SelectedIndexChanged時,我才能得到正確的計數。 – 2009-05-25 06:36:55

1

您應該知道,即使您未處理該事件,列表中的第一項仍然會在分配數據源屬性時自動選中。爲了強制用戶進行選擇,您需要取消選擇自動選擇的項目。

如果您的SelectedIndexChanged事件處理程序在選擇某個項目時觸發了某些功能,您可能仍然希望阻止其執行。一種方法是跟蹤代碼是否正在填充列表框。如果正在填充列表框而觸發SelectedIndexChanged事件,你能避免執行這些操作:

private bool _populating = false; 
private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList) 
{ 
    _populating = true; 
    lb.DataSource = reportColumnList.ReportColumns; 
    lb.DisplayMember = "ColumnName"; 
    lb.ValueMember = "ColumnName"; 

    // clear the automatically made selection 
    lb.SelectedIndex = -1; 
    _populating = false; 
} 

private void ListBox_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (!_populating) 
    { 
     // perform the action associated with selecting an item 
    } 

} 
6

有一個最簡單的回答了這個問題: 的代碼片段下面可以圍繞建議的工作。

lstBxState.SelectionMode = SelectionMode.None; 
lstBxState.DataSource = lstStates; 
lstBxState.ValueMember = "StateId"; 
lstBxState.DisplayMember = "StateName"; 
lstBxState.ClearSelected(); 
lstBxState.SelectionMode = SelectionMode.One; 

這意味着,只需將選擇模式設置爲「無」,並愉快地將數據綁定到控件。然後繼續並將模式更改爲所需模式(這裏我已將其更改爲「一個」,您也可以選擇「多個」)。

1

裏面的SelectedIndexChanged方法,只是在if語句,說坑,如果SelectedIndex == -1別的什麼也不做,做任何你想要在這個方法來做,可能不是最有效的代碼,但對我來說:)

0
private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList) 
{ 

    lb.SelectedIndexChanged -= this.*MethodnamewhichhandlesthisEvent*; //unset eventhandler 

    lb.DataSource = reportColumnList.ReportColumns; 
    lb.DisplayMember = "ColumnName"; 
    lb.ValueMember = "ColumnName"; 

    lb.SelectedIndexChanged += this.*MethodnamewhichhandlesthisEvent*; //set the eventhandler 
} 
工作

基本上從事件中刪除委託,然後在完成後添加。

0

我的情況可能是獨一無二的,但我會在這裏發佈以防萬一它有助於某人。

我在做Items.AddRange來填充我的ListBox而不是綁定。我不知道爲什麼,但在PostBack上,SelectedIndex從-1變爲0.這可能是因爲我的ListBox是SelectionMode="Single"

我的修復是對的SelectedIndex手動設置爲0,而不是-1人口後:

listBox.Items.AddRange(items); 
listBox.SelectedIndex = 0;