Dừng sự kiện selectIndexChanged của comboBox kích hoạt khi biểu mẫu tải


75

Tôi có một biểu mẫu ComboBoxcung cấp danh sách thả xuống. Trên comboBox SelectedIndexChanged event, tôi đang chạy một số mã, nhưng tôi không muốn mã đó chạy khi biểu mẫu tải. Thật không may, khi tôi tải biểu mẫu (trước khi tôi thực hiện lựa chọn trong hộp kết hợp), SelectedIndexChangedhộp kết hợp sẽ kích hoạt (tôi nghĩ là khi hộp kết hợp đó databinding). Có cách nào để tránh hành vi như vậy không?


Không chắc chắn về máy tính để bàn, nhưng trong .NET Compact, sự kiện này thực sự xuất hiện trước sự kiện Form_Load, điều này thực sự có vấn đề - không có gì trên biểu mẫu thậm chí chưa được thiết lập khi mã này được nhấn. Trên CF, giải pháp không may là một biến biểu mẫu được đặt ở cuối Tải và sau đó trình xử lý sự kiện sẽ kiểm tra biến này trước khi nó kích hoạt.
SqlRyan

Câu trả lời:


147

Nếu bạn chỉ muốn phản ứng khi người dùng thay đổi mục đã chọn trong hộp tổ hợp, thì tốt hơn là đăng ký SelectionChangeComiled .


6
Nhưng phải làm gì trong trường hợp tự động cạnh tranh?
Arijit Mukherjee

@Arijit Mukherjee đúng. Khi nhập một giá trị vào hộp văn bản thay vì chọn trực tiếp. Nó sẽ không kích hoạt sự kiện SelectionChangeComiled
thoitbk

Chết tiệt, tôi đã tìm kiếm trên web trong một thời gian khá dài để tìm ra một giải pháp đơn giản như thế này. Tôi đã sử dụng sự kiện SelectionChanged và nó hoạt động trong VB.Net - WPF và bây giờ đang sử dụng nó trên C # - WinForms và nó không hoạt động hoặc có thể chỉ tôi. Cảm ơn!
Stephan

Akams Razor - giải pháp đơn giản nhất có thể xảy ra (và tốt nhất trong trường hợp này).
Destek

13

Bạn có thể chỉ cần hủy liên kết SelectedIndexChangedsự kiện, gọi fillhàm của bạn và liên kết lại SelectedIndexChangedsự kiện. Thật không may, điều này không hoạt động với lưới.

Ví dụ:

this.cmb.SelectionChanged -= new System.EventHandler(this.cmb_SelectionChanged);
cmb.fill(); //Your function
this.cmb.SelectionChanged += new System.EventHandler(this.cmb_SelectionChanged);

6

Đảm bảo đặt thuộc DataSourcetính trong onload()hàm của bạn sau khi gán các thuộc tính ValueMemberDatamember.

Điều này sẽ giúp bạn giải quyết vấn đề của bạn!


1
Vui lòng bổ sung thêm thông tin giúp cải thiện suy nghĩ của bạn.
Lenin

@Ranjith: bạn có thể nói rõ hơn không?
Peter Mortensen

Giải quyết vấn đề. Cảm ơn nhưng xin vui lòng giải thích.
hubert 17

Việc chỉ định một Nguồn dữ liệu mới sẽ kích hoạt một sự kiện "selectIndexChanged".
John

5

Tại sao không có một booleancờ cho biết khi bạn Formtải xong?

Trong SelectionChangedsự kiện của bạn , hãy kiểm tra xem có booleancờ không true. Nếu đúng truethì xử lý sự kiện, nếu không thì bỏ qua.


2
booooooolean .. SelectionChangeCommitted nhiều đẹp hơn
Piotr Kula

3
Đã có cờ boolean `Control.Create` cho bạn biết rằng biểu mẫu đã tải xong, điều này cũng hợp lệ cho các biểu mẫu.
dùng1734987

ToolStripComboBoxbiến thể không có một SelectionChangeCommittedsự kiện. Vì vậy, phương pháp này sẽ phải làm gì. Hoặc, để ngăn chặn các điều kiện chủng tộc, sử dụng lockMonitor.TryEnter.
spoulson

@ user1734987: Đó không phải là điều tương tự. Có thể có mã khởi tạo cần được hoàn thành và Control.Create sẽ không kích hoạt điều đó.

1

VB

RemoveHandler lbxNomes.SelectedIndexChanged, AddressOf lbxNomes_SelectedIndexChanged
lbxNomes.DataSource = dst
Label1.Text = String.Format("Encontrados {0} Sócios nesta pesquisa", dst.Rows.Count)
Label1.Visible = True
AddHandler lbxNomes.SelectedIndexChanged, AddressOf lbxNomes_SelectedIndexChanged

0

Đây là một giải pháp đơn giản giúp mã của bạn gần như không bị ảnh hưởng:

Trong sự kiện SelectedIndexChanged, hãy kiểm tra xem bộ xử lý myComboBox có được tạo bằng phương thức ( IsHandleCreate ) hay không. Một kiểm tra được bổ sung khác là kiểm tra xem người dùng có thực sự tập trung điều khiển combobox của bạn để thay đổi chỉ mục đã chọn hay không.

 private void myComboBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (myComboBox.IsHandleCreated &&  myComboBox.Focused)
        {
           // Do something here
        }
    }

-1

Nó hoạt động cho tôi theo cách với mã sau:

  private void ddlChapter_SelectionChangeCommitted(object sender, EventArgs e)
    {
        if (ddlChapter.SelectedValue != null)
        {
           // Do something here
        }
    }

SelectionChangeComiled sẽ dừng để gọi các mục thay đổi chỉ mục, sau khi tất cả các mục được tải vào hộp kéo thả thì bạn chỉ có thể chọn từng mục một, nó cũng sẽ tăng tốc độ tải của bạn.
Anjan Kant
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.