2010-07-13 54 views
14

Tôi có một điều khiển người dùng có ComboBox và trình xử lý sự kiện SelectedIndexChanged. Trong trình xử lý sự kiện, tôi cần có khả năng biết chỉ số đã được chọn trước đó là gì ... bất cứ ai có thể chỉ cho tôi đúng hướng không?ComboBox SelectedIndexThay đổi sự kiện: cách nhận chỉ mục đã chọn trước đó?

private void cboTargetMode_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    // need to get the previously selected index and do some handling here... 
    // ... some handler code here ... 


    switch (cboTargetMode.SelectedIndex) 
    { 
     case 1: // ..... some code here... 
      break; 
     case 2: // ..... some code here... 
      break; 
     case 3: // ..... some code here... 
      break; 
     default: // ..... some code here... 
      break; 
    } 
} 

Trả lời

23

Không có gì được tích hợp sẵn, bạn sẽ cần lắng nghe sự kiện này và theo dõi trong biến mẫu.

Sử dụng -1 làm "chỉ mục cuối cùng" chưa được khởi tạo, do đó, lần đầu tiên bạn đặt, nhưng không sử dụng. Tiếp theo bạn sử dụng nó và thiết lập nó.

Bạn luôn có thể thực hiện việc này bằng cách sử dụng lớp ComboBox có nguồn gốc của riêng bạn và ghi đè OnSelectedIndexChanged và hiển thị thuộc tính PreviousSelectedIndex. Bằng cách này, nó sẽ không được kết hợp chặt chẽ với hình thức. Ngoài ra, khi bạn có thể thực hiện việc này bằng các sự kiện, nó cũng đủ điều kiện để triển khai dưới dạng extender provider.

+0

+1 Không thể đồng ý hơn. =) –

+0

Không nên thay vì "biến mẫu" thay vì "biến lớp"? –

+0

@FrankSchmitt Chasing huy hiệu nạo vét lên một bài đăng gần 8 năm tuổi? ;-) Nhưng có bạn là chính xác, tôi đã sửa đổi câu trả lời của tôi. –

3

Tôi đoán bạn sẽ phải lưu trữ hiện tại (mà sẽ trở thành phiên bản trước đó) vào một biến để nó được sử dụng như bộ nhớ cache hoặc một cái gì đó tương tự.

private void cboTargetMode_SelectedIndexChanged(object sender, EventArgs e) { 
    // need to get the previously selected index and do some handling here... 
    // ... some handler code here ... 

    // Assuming that the variable PreviousSelectedIndex is declared in the class with value -1. 
    if (PreviousSelectedIndex < 0) 
     PreviousSelectedIndex = cbo.TargetMode.SelectedIndex; 
    else 
     // Do some handling here... 

    switch (cboTargetMode.SelectedIndex) { 
     case 1: // ..... some code here... 
      break; 
     case 2: // ..... some code here... 
      break; 
     case 3: // ..... some code here... 
      break; 
     default: // ..... some code here... 
      break; 
    } 
} 

Đây có phải là điều bạn đã nghĩ tới không?

Nếu không, có thể làm việc với sự kiện Control.Validating? Tôi không thể nói sự kiện này xảy ra trước hoặc sau sự kiện SelectedIndexChanged. = (

0

thế nào về sự kiện comboBox_SelectionChangeCommitted? Này được gọi sau khi lựa chọn được thực hiện, trình đơn được thu nhỏ nhưng mục không compleetly thay đổi. Vì vậy, chỉ cần đọc comboBox.SelectedText hoặc comboBox.SelectedValue và thậm chí comboBox.SelectedIndex

private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e) 
{ 
    int prevIndex = comboBox1.SelectedIndex; 
} 
+0

@Zekeriya, đây là từ 6 năm trước, nhưng tôi giải quyết được vấn đề bằng cách liên kết hai chiều với 'SelectedItem' và quản lý lựa chọn trước đó trong' setter' của thuộc tính được liên kết trên mô hình khung nhìn.Và sự thật được nói, đây hóa ra là cách tốt hơn, vì nó dễ làm, và kiểm soát bất khả tri - điều đó có nghĩa là tôi không cần phải viết một số mã xử lý cho mọi điều khiển khác nhau mà tôi sẽ ràng buộc danh sách. – code4life

+0

Ok Tôi cần một giải pháp cho vấn đề này vào tháng trước nhưng người chấp nhận awnser đã không làm việc cho tôi. Trong một số loại cách phản ứng hiện tại của bạn cũng không hoạt động nhưng tôi sẽ kiểm tra nó sau này ... Cảm ơn phản ứng anyway :) –

+0

Triết lý MVVM hiện tại mà chúng tôi đang sử dụng @ cửa hàng của tôi là để tránh chuyển đổi, tránh hành vi (trừ khi hoàn toàn cần thiết) và cố gắng để có được viewmodel để làm công việc nhiều hơn - tức là làm cho * nó * cung cấp SelectedItem, vv – code4life

0

Cái này để có được những chỉ số được lựa chọn hiện tại, tôi chỉ cần nó và tôi không thể tìm thấy bất cứ nơi nào, vì vậy tôi hy vọng nó sẽ giúp

private void lsbx_layers_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      int i = lsbx_layers.SelectedIndices[0];//selected index 
      MessageBox.Show("Selected item at index : " + i); 
     } 
0

tôi đã có một vấn đề tương tự như sau, trong đó tôi đặt tất cả hộp kết hợp của tôi để "tự động hoàn thành" bằng cách sử dụng

ComboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend; 
ComboBox.AutoCompleteSource = AutoCompleteSource.ListItems; 

tôi looped qua và đặt tất cả lostFocus Sự kiện của họ:

foreach(Control control in this.Controls) 
{ 
    if(control is ComboBox) 
    { 
     ((ComboBox)control).LostFocus += ComboBox_LostFocus; 
    } 
} 

và đã có một đối tượng từ điển để giữ giá trị cũ

public Dictionary<string, int> comboBoxOldValues = new Dictionary<string, int>(); 

sau đó cuối cùng đảm bảo giá trị tồn tại hoặc thiết lập để cũ chỉ mục, sau đó lưu vào từ điển

private void ComboBox_LostFocus(object sender, EventArgs e) 
{ 
    ComboBox comboBox = (ComboBox)sender; 

    if (comboBox.DataSource is List<YourDataType>) 
    { 
     if (((List<YourDataType>)comboBox.DataSource).Count(x => x.YourValueMember == (YourValueMemberType)comboBox.SelectedValue) == 0) 
     { 
      if (comboBoxOldValues.Keys.Count(x => x == comboBox.Name) > 0) 
      { 
       comboBox.SelectedIndex = comboBoxOldValues[comboBox.Name]; 
      } 
      else 
       comboBox.SelectedIndex = -1; 
     } 
    }    

    if (comboBoxOldValues.Keys.Count(x => x == comboBox.Name) > 0) 
    { 
     comboBoxOldValues[comboBox.Name] = comboBox.SelectedIndex; 
    } 
    else 
     comboBoxOldValues.Add(comboBox.Name, comboBox.SelectedIndex); 

    if (comboBox.SelectedIndex == -1) 
     comboBox.Text = string.Empty; 
} 
Các vấn đề liên quan