2013-01-01 52 views
8

Tôi có điều khiển ComboBox (dự án WinForm).Làm thế nào để ngăn chặn sự kiện đã chọn được thay đổi khi DataSource bị ràng buộc?

Khi tôi liên kết DataSource với sự kiện ComboBox_selectedindexchanged điều khiển ComboBox được kích hoạt.

Bất kỳ ý tưởng nào về cách ngăn chặn sự kiện đã chọn được thay đổi khi DataSource bị ràng buộc?

+1

bạn có thể thiết lập một lá cờ, thiết lập DataSource và unset cờ? Sau đó, trong trình xử lý sự kiện của bạn, bạn có thể thấy cờ được đặt và không thực hiện hành động nào. – prprcupofcoffee

+1

WinForms hoặc WPF? – Paparazzi

+0

sử dụng bảng cập nhật – sajanyamaha

Trả lời

28

Xóa trình xử lý cho sự kiện SelectedIndex_Changed, liên kết dữ liệu của bạn, sau đó thêm trình xử lý. Sau đây là một ví dụ đơn giản về cách này có thể được thực hiện trong vòng một phương pháp:

private void LoadYourComboBox() 
{ 
    this.comboBox1.SelectedIndexChanged -= new EventHandler(comboBox1_SelectedIndexChanged); 


     // Set your bindings here . . . 


    this.comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged); 
} 
2

Đừng nghĩ rằng bạn có thể dừng sự kiện nhưng bạn không thể xử lý sự kiện.

Tách trình xử lý sự kiện, liên kết và sau đó đính kèm trình xử lý sự kiện.

9

Tôi biết đây là một bài cũ và nó có một câu trả lời chấp nhận nhưng tôi nghĩ rằng chúng ta có thể sử dụng SelectionChangeCommitted sự kiện như một giải pháp để tránh trường hợp bắn trong databind.

Lựa chọnThay đổi Sự kiện bị hủy chỉ kích hoạt khi người dùng thay đổi lựa chọn trong hộp tổ hợp.

similar question trên SO và câu trả lời này được cung cấp bởi @arbiter.

+0

Trong khi câu trả lời được chấp nhận hoạt động như dự định, tôi ước tôi đọc bài này trước tiên. Nó là đơn giản hơn rất nhiều để thực hiện, và một heck của rất nhiều đơn giản để đọc cho những người khác sau đó ... Vì vậy, cảm ơn bạn, bài viết hai năm tuổi! – Noceo

+0

Điều này phải là câu trả lời đúng theo ý kiến ​​của tôi.Câu trả lời ở trên hoạt động nhưng trong một ứng dụng mà bạn có nhiều hộp tổ hợp và nguồn dữ liệu, bạn có thể tưởng tượng phải hủy đăng ký và đăng ký lại mỗi lần bạn muốn gây rối với nguồn dữ liệu không? Thanks @shreesha –

0

Đây là cách đơn giản. Bạn có thể sử dụng thuộc tính Thẻ của combobox. Nó có thể trống hoặc 0 giá trị nguyên khi nó trống hoặc chưa hoàn thành. Bạn phải đặt Thẻ của combobox là số lượng mục của nó sau khi giới hạn. Trong sự kiện SelectedValueThay đổi nếu thuộc tính Thẻ là null hoặc 0, bạn phải trả về từ void.

Đây là một số mẫu từ dự án của tôi.

private void cb_SelectedValueChanged(object sender, EventArgs e) 
{ 
    if (!(sender is ComboBox)) return; 
    ComboBox cb = sender as ComboBox; 
    if (DataUtils.ToInt(cb.Tag, 0) == 0) return; 
    if (cbSmk.SelectedValue == null) return; 
    /* Continue working; */ 
} 

public static void ComboboxFill(ComboBox cb, string keyfld, string displayfld, string sql) 
{   
    try 
    { 
     cb.Tag = 0; 
     cb.DataSource = null; 
     cb.Items.Clear(); 

     DataSet ds = DataMgr.GetDsBySql(sql); 
     if (!DataUtils.HasDtWithRecNoErr(ds)) 
     {      
      cb.Text = "No data"; 
     } 
     else 
     { 
      cb.DataSource = ds.Tables[0]; 
      cb.DisplayMember = displayfld; 
      cb.ValueMember = keyfld; 
     } 
     cb.Tag = cb.Items.Count; 
    } 
    catch (Exception ex) 
    { 
     Int32 len = ex.Message.Length > 200 ? 200 : ex.Message.Length; 
     cb.Text = ex.Message.Substring(0, len); 
    }     
} 

CmpHelper.ComboboxFill(cbUser, "USER_ID", "USER_NAME", "SELECT * FROM SP_USER WHERE 1=1 ORDER by 1",-1); 
1

Sử dụng SelectionChangeCommitted tổ chức sự kiện thay vì 'SelectedIndexChanged'

SelectionChangeCommitted được nâng lên chỉ khi người dùng thay đổi các lựa chọn hộp combo. Không sử dụng SelectedIndexChanged hoặc SelectedValueChanged để nắm bắt các thay đổi của người dùng, bởi vì những sự kiện đó là cũng tăng khi lựa chọn thay đổi theo lập trình.

TỪ https://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.selectionchangecommitted.aspx

Các vấn đề liên quan