2009-03-13 10 views
8

Tôi có một ComboBox có các mục được đặt bằng thuộc tính DataSource. DataSource là tập hợp một đối tượng tùy chỉnh (có thuộc tính chuỗi 'Giá trị' và thuộc tính int 'Id'). Trong các điều khiển khởi tạo, tôi đặt DisplayMemberGiá trịGiá trịMemberId. Bây giờ tôi đã cố gắng xóa DataSource bằng cách gọi,DisplayMember được đặt lại trên DataSource = null

myComboBox.DataSource = null; 

Khi tôi làm điều đó, DisplayMember của tôi được đặt lại tự động ". Tôi có xóa DataSource đúng cách không ?? Đó có phải là cách tôi nên cư xử không ???

Trả lời

3

Tôi có thể tạo lại nó ... nó không phải là điều tôi mong đợi, nhưng có vẻ như bạn sẽ chỉ cần đặt lại DisplayMember sau đó.

Nhìn trong gương, điều này là khá cố ý:

 if (value == null) 
     { 
      this.DisplayMember = ""; 
     } 

Không chắc chắn về lý luận đằng sau đó, nhưng chỉ đơn giản là:

string oldDisplayMember = cbo.DisplayMember; 
cbo.DataSource = null; 
cbo.DisplayMember = oldDisplayMember; 

Không đẹp, nhưng nó sẽ làm việc.

+0

Vì vậy, cách nó hoạt động, phải không ??? –

+0

Vâng, "chức năng như được viết" ;-p Nhưng nó vi phạm một số hành vi đặc tính điển hình (tức là tác dụng phụ không mong muốn). –

0

Khi có ngoại lệ được ném hoặc nếu giá trị Nguồn dữ liệu là rỗng, thì Displaymember được đặt thành một chuỗi trống.

Sử dụng trình giải mã mã .NET, có các nhận xét trong mã về cách hoạt động của tính năng này. Tôi sẽ cố gắng diễn giải.

Exceptions có thể được ném vào các trường hợp sau:

  1. mã ứng dụng trên DataSourceChanged
  2. Trong ràng buộc khi dữ liệu đang được định dạng để hiển thị
  3. Nếu giá trị DisplayMember là không hợp lệ trong mới Nguồn dữ liệu.

Nhận xét cũng đề cập đến ngoại lệ thực tế là "nuốt" để tránh vi phạm hành vi mong đợi.

Cá nhân tôi đã gặp phải hành vi này và vì ngoại lệ không được ném nên thật khó để tìm ra điều kiện nào trong số các điều kiện này gây ra việc đặt lại. Có lẽ là một cách tốt hơn nhưng bây giờ tôi đang sử dụng điều này trong kiểm soát tùy chỉnh của tôi. Thuộc tính Nguồn dữ liệu hợp lệ khi đặt DisplayMember sau khi được đặt lại vì vậy tôi thực sự không chắc chắn về lý do tại sao nó không thành công:

public new object DataSource 
    { 
     get { return base.DataSource; } 
     set 
     { 
      string displayMem = this.DisplayMember; 
      base.DataSource = value; 
      if (string.IsNullOrEmpty(this.DisplayMember) && string.IsNullOrEmpty(displayMem)) 
       this.DisplayMember = displayMem; 
      DetermineDropDownWidth(); 
     } 
    }