2013-10-08 32 views
0

這裏是我的代碼示例:選擇索引Changed事件觸發兩次

private void listView1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (listView1.SelectedItems.Count < 1) 
    { 
     MessageBox.Show("Please select an item first."); 
    } 
    else 
    { 
     string name = listView1.SelectedItems[0].SubItems[0].Text; 
     Binddata(name); 
    } 
} 

public void Binddata(string name) 
{ 
    textBox1.Text=name;    
} 

我的Windows操作系統在看起來就像這樣:

Form

當我點擊項目1對第一次文本框顯示Item1。但是,如果我點擊Item2,所選項目的數量將變爲「0」,因此它將顯示消息爲「請先選擇一個項目」。如果我按下ok,那麼事件就會被觸發,Item2會被綁定。

如果我缺少任何東西,請幫助我。提前致謝。

+0

我認爲你可以省略你的檢查Items-count。這是由於這樣一個事實,即當您單擊另一個項目時,第一個選定的項目會失去焦點,因此會觸發changeEvent。第二個事件因爲另一個項目獲得焦點而被解僱。您可以檢查您的BindData名稱是否爲空... – HimBromBeere

+0

顯示您的form_int和form_load事件的代碼.......... –

+0

@ HimBromBeere我正在檢查項目數,因爲當我點擊item2選擇item1後,計數變爲「0」。而且我在Binddata中得到的名字是正確的,因爲當我在消息框中按下確定時它正在顯示。 – satyanarayana

回答

1

不知道爲什麼會發生這種情況,我認爲它會觸發一次,取消選擇上一個選定項目,第二次選擇新項目。

作爲解決方法,使用Timer這樣。

private void listView1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     var timer = new System.Windows.Forms.Timer() { Interval = 50 }; 
     EventHandler handler = null; 
     handler = (x, y) => 
     { 
      timer.Tick -= handler; 
      timer.Enabled = false; 
      timer.Dispose(); 

      if (listView1.SelectedItems.Count < 1) 
      { 
       MessageBox.Show("Please select an item first."); 
      } 
      else 
      { 
       string name = listView1.SelectedItems[0].SubItems[0].Text; 
       Binddata(name); 
      } 
     }; 
     timer.Tick += handler; 
     timer.Enabled = true; 
    } 
+0

謝謝Sriram。現在工作正常。 – satyanarayana

+0

@satyanarayana不客氣,你需要克服多重選擇的情況,當取消選擇項目也多次填充火災。將此代碼作爲一個良好的開始,並將其構建起來:) –

0

這是正常行爲。唯一不正常的部分是當你沒有選擇項目時拋出一個MessageBox。 ListView可以選擇零個項目,您需要優雅地處理它。

如果您不喜歡這種行爲,您應該使用ListBox控件,該控件始終需要選擇1個項目,並且不會拋出多個SelectedIndexChanged事件。

0

根據MSDN

當用戶不按下CTRL執行 多重選擇選擇項目,控制首先清除先前的選擇。 在這種情況下,對於之前選擇的每個項目爲 ,此事件發生一次,對於新選擇的項目,此事件發生一次。

您可以檢查是否在其他事件處理程序(如按鈕單擊)中選擇了任何項目。