2015-01-12 92 views
1

我有一個問題從這個問題導致:How can I handle ComboBox selected index changing?該問題的答案的第一個評論基本上要求與我在這裏問的相同。如何返回索引更改事件上的先前選擇的索引

它描述瞭如何捕捉索引更改事件。這工作正常,但我有一個錯誤提供程序等待這個事件,有效地使某些領域強制性。如果它等於真(或換句話說,強制性字段爲空),則它退出子。

這工作正常;數據保持不變並且強調字段突出顯示,但是由於所選索引已經改變的事實而出現問題。換句話說,您可以看到原始索引中的數據,但組合框中實際突出顯示的索引已經更改。該事件的ChangedIndex,它在索引更改時觸發。

無論如何我可以重新選擇以前的索引和/或取消轉換到新的索引?是否有類似ChangeNode的事件與DeletingRecord對RecordDeleted事件的作用相似?

編輯我正在使用ListBox而不是沒有SelectedIndexChanging事件的組合框。 ,

listBox.SelectionChanged += new SelectionChangedEventHandler(listBox_SelectionChanged);

做一次檢查,如果你的錯誤提供商有true值,如果是這樣,我:

回答

1

如果您使用的ListBoxSystem.Windows.Controls命名空間,你可以添加一個事件處理程序ListBox.SelectionChanged相信這應該工作(我有使用相同的事件ComboBox控制類似的邏輯):

您可以將其添加到事件處理程序:

//Check if error provider returned true 
if(hasError) 
{ 
    //Cast the sender object as ListBox 
    ListBox listbox = (ListBox)sender; 

    //If there was already something selected before, set it as the SelectedItem 
    if(e.RemovedItems.Count > 0) 
    { 
     listBox.SelectedItem = e.RemovedItems[0]; 
    } 
} 

當然,如果您能夠選擇多個項目,這可能不起作用。

編輯:因爲它似乎就像你在System.Windows.Forms命名空間中使用ListBox(不具備SelectionChanged事件),你可以嘗試在你的代碼的屬性後面,表示當前選定的指數ListBox

在您的SelectedIndexChanged事件中,檢查錯誤提供程序的條件。如果它有錯誤,則返回保存到您的屬性的項目,否則將值更新爲新選擇的項目。

不是最優雅的解決方案,但它應該工作。

int _CurrentSelectedIndex = -1; //variable to keep track of the SelectedIndex initialized to default value (-1) 

//Add event listener to the ListBox.SelectedIndexChanged event 
ListBox listBox.SelectedIndexChanged += new EventHandler(list_SelectedIndexChanged); 


    //Event handler implementation 
    void listbox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     //Cast the sender object as ListBox 
     ListBox listbox = (ListBox)sender; 

     //validation function detected an error 
     if(!passedValidation) 
     { 
      listBox.SelectedIndex = _CurrentSelectedIndex; //revert to the previously selected item 
     } 

     //Passed validation - update variable to keep track of the SelectedIndex 
     else 
     { 
      _CurrentSelectedIndex = listBox.SelectedIndex 
     } 
    } 
+0

我試過把它放到我的代碼中,但似乎sysargs沒有'RemovedItems'參數。我正在從SelectedIndexChanged事件和VB.net中工作。不知道這是否與它有關? –

+0

只有幾個我可以使用的論據,沒有做任何我需要的。 –

+0

@Noodlemanny這聽起來像你在'System.Windows.Forms'命名空間中使用'ListBox',而不是'System.Windows.Controls'中的'ListBox',因爲你使用'SelectedIndexChanged'事件而不是'SelectionChanged事件。你必須在'System.Windows.Forms'中使用ListBox嗎? – Saggio

0

考慮過這個問題後,我想出了一個簡單的解決方案。我簡單地創建了一個名爲'ListBoxIndex'的新變量,併爲其提供了默認的開始索引。當所有必填字段都被填充並且驗證函數通過true時,我將ListBoxIndex的值設置爲listBox.SelectedIndex。當驗證返回false時,我簡單地將listBox.SelectedIndex重置爲ListBoxIndex值,從而將其重置爲以前的索引。

+0

很高興您能夠使用它!但是,這不是我上面的同樣的解決方案(唯一的變化是我在'ListBox'上的一個事件中完成了,就像你試圖在OP中一樣)? :p – Saggio

+0

公平起見,我並不真正理解你的解決方案,更不用說讓它工作:/無論如何, –

+0

本質上就是你上面描述的 - 我在ListBox的SelectedIndexChanged事件中添加了一個事件處理程序,如果驗證函數返回'false'(由'!passedValidation'布爾變量表示),它將'SelectedIndex'設置爲'_CurrentSelectedIndex'變量中保存的索引。如果它通過驗證,則將_CurrentSelectedIndex中的值更新爲其更改的值。什麼部分很難遵循?我更新了一下,但讓我知道如果我應該添加更多的細節,以幫助將來有類似問題的任何人 – Saggio

相關問題