2009-06-12 27 views
7

Có thể làm như sau trong một DataGridView:Windows Forms kiểm soát DataGridView có các loại điều khiển khác nhau trong cùng một cột

Trong cùng một cột tôi muốn thay đổi kiểu kiểm soát của mỗi hàng giữa DataGridViewTextBoxColumn và DataGridViewComboBoxColumn?

(điều này là do đôi khi tôi muốn hiển thị danh sách thả xuống và các lần khác tôi chỉ muốn người dùng nhập giá trị tự do).

Xin cảm ơn,

P.S. Tôi đang sử dụng C#

+0

Câu hỏi rất hay. Nó chỉ là vấn đề thời gian cho đến khi một người gặp vấn đề này khi sử dụng lớp DataGridView. – TheBlastOne

Trả lời

0

Bạn có thể tạo lớp của riêng bạn được kế thừa từ DataGridViewCell và ghi đè lên các thành viên ảo đầy đủ (InitializeEditingControls, EditType, có thể một số khác). Sau đó bạn có thể tạo một DataGridViewColumn với một thể hiện của lớp này là mẫu di động

+0

Cảm ơn vì điều này. Có vẻ như đường đi đúng. Thật không may tôi mới mẻ với điều này và tôi không thể có được các tế bào xuất hiện không có vấn đề gì tôi làm. Tôi đã chỉnh sửa lại EditType như được đề xuất. Nếu tôi kế thừa từ nói 'DataGridViewTextBoxCell' sau đó tôi có thể nhìn thấy các tế bào, kế thừa từ 'DataGridViewCell' và ghi đè EditType để trở về typeof (DataGridViewTextBoxEditingControl) mang lại cho tôi một ô trống - Tôi có thể nhìn thấy cột mặc dù. Tôi chắc chắn có điều gì đó hiển nhiên tôi đã bỏ lỡ. –

+0

Có vẻ như điều khiển chế độ xem không hiển thị hoặc có chiều rộng nếu không? Tôi có thể tab để kiểm soát, nhấn F2 và nhập một giá trị. Khi tôi thoát ra, tôi không thể nhìn thấy nó, khi tôi trở lại chế độ chỉnh sửa nó vẫn còn đó. –

+0

Tôi nghĩ bạn cũng cần phải ghi đè PositionEditingPanel và PositionEditingControl. Nhưng tôi không bao giờ tự làm, vì vậy tôi chỉ có thể đoán ... Bạn nên sử dụng Reflector để xem mã cho DataGridViewCells chuẩn, nó có thể sẽ cho bạn thấy những gì bạn cần làm –

0

Bạn có thể tạo cột mẫu với cả hai điều khiển trong, ẩn một cột bạn không muốn và liên kết với nguồn dữ liệu trong mã.

+0

Cột mẫu dành cho ASP.NET GridView, không phải WinForms DataGridView ... –

+0

Ahh, tệ của tôi. Đã một thời gian kể từ khi tôi làm việc với WinForms. – atfergs

7

Tôi vừa mới có một usecase tương tự, và đã kết thúc viết một cái gì đó giống như mã bên dưới:

Viết di động tùy chỉnh và lớp Cột , và ghi đè lên các phương pháp EditType và InitializeEditingControl trên tế bào, để trở về điều khiển khác nhau cho phù hợp (ở đây tôi chỉ databinding vào một danh sách của một lớp tùy chỉnh với lĩnh vực .useCombo chỉ ra những gì kiểm soát để sử dụng):

// Define a column that will create an appropriate type of edit control as needed. 
public class OptionalDropdownColumn : DataGridViewColumn 
{ 
    public OptionalDropdownColumn() 
     : base(new PropertyCell()) 
    { 
    } 

    public override DataGridViewCell CellTemplate 
    { 
     get 
     { 
      return base.CellTemplate; 
     } 
     set 
     { 
      // Ensure that the cell used for the template is a PropertyCell. 
      if (value != null && 
       !value.GetType().IsAssignableFrom(typeof(PropertyCell))) 
      { 
       throw new InvalidCastException("Must be a PropertyCell"); 
      } 
      base.CellTemplate = value; 
     } 
    } 
} 

// And the corresponding Cell type 
public class OptionalDropdownCell : DataGridViewTextBoxCell 
{ 

    public OptionalDropdownCell() 
     : base() 
    {   
    } 

    public override void InitializeEditingControl(int rowIndex, object 
     initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) 
    { 
     // Set the value of the editing control to the current cell value. 
     base.InitializeEditingControl(rowIndex, initialFormattedValue, 
      dataGridViewCellStyle); 

     DataItem dataItem = (DataItem) this.OwningRow.DataBoundItem; 
     if (dataItem.useCombo) 
     { 
      DataGridViewComboBoxEditingControl ctl = (DataGridViewComboBoxEditingControl)DataGridView.EditingControl; 
      ctl.DataSource = dataItem.allowedItems; 
      ctl.DropDownStyle = ComboBoxStyle.DropDownList; 
     } 
     else 
     { 
      DataGridViewTextBoxEditingControl ctl = (DataGridViewTextBoxEditingControl)DataGridView.EditingControl; 
      ctl.Text = this.Value.ToString(); 
     } 
    } 

    public override Type EditType 
    { 
     get 
     { 
      DataItem dataItem = (DataItem)this.OwningRow.DataBoundItem; 
      if (dataItem.useCombo) 
      { 
       return typeof(DataGridViewComboBoxEditingControl); 
      } 
      else 
      { 
       return typeof(DataGridViewTextBoxEditingControl); 
      } 
     } 
    } 
} 

Sau đó, chỉ cần thêm một cột vào DataGridView của loại này và điều khiển chỉnh sửa chính xác sẽ là u sed.

+0

+1, điều này có vẻ khá hữu ích và sạch sẽ đối với tôi. Điều thú vị về điều này là nó chỉ báo hiệu lớp điều khiển chỉnh sửa cần thiết "ngay trong thời gian" trong trình chỉnh sửa EditType, cho phép Grid thực hiện công việc khó khăn và sử dụng điều khiển chỉnh sửa được tạo bằng cách tham chiếu đến DataGridView.EditingControl. – TheBlastOne

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