2009-04-24 30 views
13

Tôi có một vấn đề nhỏ khiến tôi khó chịu trong vài giờ.Phần chỉnh sửa của ComboBox được chọn tự động

Trong ứng dụng WinForms (.NET 3.5) của tôi, tôi tạo một số ComboBoxes (DropDownStyle = DropDown) trong TableLayoutPanel khi chạy và điền nó bằng chuỗi. ComboBoxes được cấu hình để thay đổi kích thước tự động (Anchor = Left | Right).

Vấn đề là bất cứ khi nào các ComboBox được thay đổi kích cỡ (tức là hộp thoại được thay đổi kích cỡ), phần editbox của ComboBox được chọn/được đánh dấu hoàn toàn. Theo ý kiến ​​của tôi, điều này tạo ra một hiệu ứng rất khó hiểu cho khách hàng mà tôi muốn tránh.

Sự cố không xuất hiện nếu ComboBox có kích thước cố định.

Cũng lưu ý rằng việc thay đổi DropDownStyle không phải là một tùy chọn - tôi cần khả năng nhập văn bản theo cách thủ công.

Tôi đã thử xáo trộn xung quanh bằng cách ghi đè phương pháp OnPaint, phương thức này không hoạt động. Tôi cũng đã thử xóa lựa chọn trong sự kiện ComboBox.Resize, hoạt động theo cách, nhưng có vẻ như một giải pháp rất xấu - có rất nhiều nhấp nháy, văn bản được chọn cố ý bị bỏ chọn và tôi sẽ phải thêm trình xử lý sự kiện vào mỗi ComboBox trên hộp thoại của tôi.

Có giải pháp nào tốt hơn cho vấn đề này không?

Cảm ơn bạn trước.

Kính trọng, Andy

+0

Phần văn bản không thể chỉnh sửa được khi bạn sử dụng DropDownList. Ý của bạn là DropDown? –

Trả lời

13

Đây là một câu hỏi cũ, nhưng tôi thấy nó tìm kiếm một câu trả lời và kết thúc việc thực hiện giải pháp của riêng tôi. Cũng có thể đăng nó ở đây, phải không?

foreach (var cb in Controls.OfType<ComboBox>()) 
    { 
     cb.Resize += (sender, e) => { 
      if (!cb.Focused) 
       cb.SelectionLength = 0; 
     }; 
    } 

văn bản đã chọn cố ý trở nên bỏ chọn

lỗi WinForms này không ảnh hưởng ComboBoxes chọn, vì vậy bằng cách bỏ qua những người thân với Focus, chúng tôi chăm sóc của vấn đề mất lựa chọn hiện thời.

Tôi sẽ phải thêm trình xử lý sự kiện vào mỗi và mọi ComboBox trên hộp thoại của mình.

Được chăm sóc bởi vòng lặp foreach. Đặt nó trong InitializeComponent() hoặc của bạn .ctor nếu bạn không muốn phá vỡ các nhà thiết kế, hoặc có thiết kế phá vỡ này.

đã có rất nhiều các nhấp nháy

Tôi chỉ thấy nhấp nháy nếu tôi thay đổi kích thước rất nhanh, nhưng tôi trên Win7 nên nó có thể khác nhau trên XP.

+0

Tôi muốn đề xuất làm điều này.SelectNextControl hoặc combobox.SelectNextControl –

+0

Cảm ơn vì điều này. Nó đã được bugging cho tôi một thời gian và chỉ bây giờ chỉ có 'tròn để sửa chữa nó. Mỗi điều khiển kiểu hộp kết hợp trong ứng dụng của tôi kế thừa từ một đối tượng cơ sở (vì vậy tôi có thể có một nhãn, các phương thức phổ biến, v.v.). Đặt trong một xử lý sự kiện OnResize cho hộp combo đã giải quyết vấn đề của tôi, thay vì phải lặp lại. Cảm ơn! –

2

Wow. Cảm ơn các bạn!

Rõ ràng lỗi này đã tồn tại trong nhiều năm. Tôi đang xây dựng một UserControl với .Net 4 (Visual Studio 2010). Đây là phiên bản sửa đổi nhỏ của mã bsneeze.

Cheers

using System.Windows.Forms; 
using System.Linq; 

public MyUserControlCtor() 
{ 
    InitializeComponent(); 

    foreach(Control ctrl in Controls) 
    { 
     ComboBox cb = ctrl as ComboBox; 
     if (cb != null) 
     { 
      cb.Resize += (sender, e) => 
      { 
       if (!cb.Focused) 
        this.FCHZ_ComboBox.SelectionLength = 0; 
      }; 
     } 
    } 
} 
+0

Tôi thích ký hiệu này tốt hơn nhiều foreach (var cb trong Controls.OfType ()) – CodingBarfield

0

tôi tìm thấy thiết lập độ dài lựa chọn để 0 cho combo-box trên các sự kiện thay đổi kích thước của bất cứ kiểm soát combo-box là nguyên nhân một nhiều ít nhấp nháy thay vì làm nó trên thay đổi kích thước của combo chính nó.

Tôi thực sự đạt được điều này trong VB.Net nhưng nó sẽ áp dụng giống với C#.

1

Không có câu trả lời nào cho đến nay có hiệu quả đối với tôi. Phương pháp đáng tin cậy duy nhất tôi đã tìm thấy là đăng một thông báo không đồng bộ qua BeginInvoke đặt SelectionLength trở về không sau khi tất cả các hoạt động khác trên bộ điều khiển đã hoàn thành. Số lượng nhấp nháy là rất khó chịu và không chuyên nghiệp, nhưng nó là tốt nhất tôi có thể đến với ... cho đến nay.

internal class FixedComboBox : ComboBox 
{ 
    protected override void OnResize(EventArgs e) 
    { 
     if (IsHandleCreated && !Focused) 
     { 
      BeginInvoke((Action)(() => 
       { 
        SelectionLength = 0; 
       })); 
     } 
     base.OnResize(e); 
    } 
} 
+0

Tôi tự hỏi nếu các câu trả lời khác ở đây không hiệu quả với bạn vì 'ComboBox' của bạn nằm trong' TableLayoutPanel'? –

+0

@ JeffRoe: Tôi không nhớ chi tiết. Đã quá lâu rồi, nhưng vâng, điều đó là rất có thể. –

0

Xử lý sự kiện Resize cho vùng chứa mẹ của ComboBox. Đặt dòng này trong đó:

MyComboBox.SelectionLength = 0

Một thí dụ (VB, rõ ràng):

Private Sub MyControl_Resize(sender As Object, e As EventArgs) Handles Me.Resize 

    MyComboBox.SelectionLength = 0 

End Sub 

Chúc may mắn cho bạn!

--BP

0

này dường như là một lỗi trong Windows thực hiện nguồn gốc của ComboBox với DropDownStyle của DropDown.

Sửa chữa chi tiết trong các câu trả lời khác tại đây (đặt thuộc tính SelectionLength thành 0 (0) trong sự kiện Resize của) hoạt động tốt hầu hết thời gian.

Tuy nhiên, tôi thấy rằng ngay cả khi sửa chữa để làm việc xung quanh lỗi này không phải lúc nào cũng hoạt động. Nếu số ComboBox nằm trong số TableLayoutPanel và nếu điều đó TableLayoutPanel có nhiều hơn một cột với Loại kích thước Percent thì việc sửa lỗi đó thường không hoạt động.

Một bức tranh trị giá một nghìn chữ. Xem ảnh chụp màn hình sau của biểu mẫu tôi đã thực hiện để chứng minh sự cố.

enter image description here

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