2010-02-16 55 views
5

好了,所以我想通過使用多個按鈕,即禁用按鈕問題

從一個列表框移動項目的方式我有2個按鈕cmdRight和cmdRight2這兩者都是對的形式負載殘疾人

如果用戶在第一個列表框中選擇一個項目cmdRight按鈕啓用,但如果用戶在第一個列表框中選擇了多個項目,則cmdRight2仍然被禁用。cmdRight2按鈕啓用但禁用了cmdRight。

我有移動按鈕的工作,但我遇到的問題是移動多個項目後,cmdRight2按鈕的cmdRight按鈕啓用(它不應該它應該只啓用後,選擇一個單一的項目列表框)。我已經嘗試了很多如果陳述等,但它仍然發生。

我是C#的新手,所以任何幫助,將不勝感激。

謝謝

 private void lbList1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (this.lbList1.SelectedItems != null) 
      { 
       cmdRight.Enabled = true; //enable cmdRight 
       cmdClear.Enabled = true; //enable cmdClear 
       if (this.lbList1.SelectedItems.Count > 1)//if multiple items selected 
       { 
        cmdRight.Enabled = false; 
        cmdRight2.Enabled = true; //enable cmdRight2    
       } 
      } 
     } 


    private void cmdRight2_Click(object sender, EventArgs e) 
    { 
     foreach (int i in lbList1.SelectedIndices) 
     { 
      lbList2.Items.Add(lbList1.Items[i].ToString()); 
     } 
     while (lbList1.SelectedItems.Count > 0) 
     { 
      lbList1.Items.Remove(lbList1.SelectedItems[0]); 
     } 
     cmdRight2.Enabled = false; 

    } 

    private void cmdRight_Click(object sender, EventArgs e) 
    { 
     lbList2.Items.Add(lbList1.SelectedItem); //Add selected item from list1 to list2 
     lbList1.Items.Remove(lbList1.SelectedItem);//remove the selected item in list1 

     cmdRight.Enabled = false; //disable cmdRight 
    } 
+0

有你把斷點在每個函數的開始以查看它們被調用的順序?或者至少每次將cmdRight.Enabled設置爲true時斷點。 – taylonr

+1

這不是您的問題的答案,但爲什麼不只是結合這兩個按鈕(通過簡單地消除cmdRight並保持cmdRight2)?顯然我不知道你的設計,但它可能會解決你的問題。 –

+0

我試過斷點,出於某種原因if語句「if(this.lbList1.SelectedItems!= null)」似乎總是如此。即使沒有選擇任何東西 –

回答

1

我想你想

if (this.lbList1.SelectedItems.Count == 1) 
{ 
} 
else if(this.lbList1.SelectedItems.Count > 1) 
{ 
} 
else 
{ 
} 

,而不是

if (this.lbList1.SelectedItems != null) 

然後如其他地方提到的,你可以把所有這一切都在一個名爲「EnableButtons」方法

+0

Yey !!! That works thank you soooo much! 我會研究下一步的方法,非常感謝! –

+0

當你正在解決問題,並且你看到像SelectedItems這樣的東西永遠不會是空的,你需要找到另一個開關(在這種情況下,項目數量爲s當選) – taylonr

3

如何創建一個方法EnableButtons,使按等給出標準/禁止向按鈕「使cmdRight2只有....是真實的」。

然後,只要某些標準可能改變,就調用該方法。這樣做的好處就是你現在做的方式是方法中的標準是「絕對的」(因爲按鈕一次啓用或禁用)而不是「相對」(當用戶啓用按鈕時做這個或那個)。

您也可以從Application.Idle事件中調用此方法,而不是響應某些用戶操作調用該方法。

編輯

聲明如下方法:

private void EnableButtons() 
{ 
    controlX.Enabled = (<condition...>); 
    controlY.Enabled = (<condition...>); 
} 

您可以調用在代碼中的東西應該在按鈕更改位置這種方法來使能狀態,或者你可以做以下是表單的構造函數:

public Form1() 
{ 
    // Other code... 

    Application.Idle += new <The respective event handler>; 
} 

然後,用相應的簽名聲明一個方法在那裏,並致電EnableButtons。在應用程序「空閒」(等待用戶操作)的情況下,將調用此方法。

+0

我對編程很陌生,所以我是不知道該怎麼做......:-S –

+0

好的建議,他仍然需要修復啓用/禁用邏輯, – taylonr

+0

@KP:我用一些僞代碼編輯我的回覆,你會很容易找到我的意思是 - 我現在只是沒有正確的語法。 –

0

問題是您要逐個刪除項目,因此當只剩下一個項目時,您基本上選擇了一個項目,以便您的程序啓用cmdRight。最簡單的方法是在cmdRight2_Click方法的末尾有

cmdRight2.Enabled = false; 
cmdRight.Enabled = false;