2012-06-06 46 views
10

Winforms .NET 3.5 (C#)Hiển thị điều khiển người dùng trong DatagridViewCell

Tôi có DataGridView (DGView) và tôi đã tạo CustomColumn và CustomCell được hiển thị trong DGView. Tôi tạo ra một CustomUserControl mà tôi muốn hiển thị trong CustomCell.

Sự cố: Tôi không thấy điều khiển người dùng trong cột. Tôi nghĩ rằng tôi cần phải ghi đè lên Paint() phương pháp trong CustomCell - Bất kỳ điểm nào làm thế nào tôi có thể làm điều đó?

Lưu ý - Ví dụ MSDN về điều khiển người dùng lưu trữ là để chỉnh sửa giá trị ô - nơi bạn thực hiện điều khiển người dùng của mình ở nơi bạn đang chỉnh sửa ô. Tôi muốn kiểm soát người dùng của tôi để hiển thị như một điều khiển winform bình thường. Điều khiển người dùng này hiển thị thông báo cho hàng .. và mỗi hàng có thể có các thông báo khác nhau. Tôi muốn người dùng có thể nhấp vào thông báo và biết thêm chi tiết về nó. .. nhưng hiện tại tôi bị kẹt tại "làm cách nào để hiển thị điều khiển người dùng này"

Mọi con trỏ sẽ được đánh giá cao.

public class CustomColumn : DataGridViewColumn { 
    public CustomColumn() : base(new CustomeCell()) { } 
    public override DataGridViewCell CellTemplate 
    { 
     get 
     { 
      return base.CellTemplate; 
     } 
     set 
     { 
      // Ensure that the cell used for the template is a CalendarCell. 
      if (value != null && 
       !value.GetType().IsAssignableFrom(typeof(CustomeCell))) 
      { 
       throw new InvalidCastException("It should be a custom Cell"); 
      } 
      base.CellTemplate = value; 
     } 
    } 
} 
public class CustomeCell : DataGridViewTextBoxCell 
{ 
    public CustomeCell() : base() { } 
    public override Type ValueType 
    { 
     get 
     { 
      return typeof(CustomUserControl); 
     } 
    } 
    public override Type FormattedValueType 
    { 
     get 
     { 
      return typeof(CustomUserControl); 
     } 
    } 
} 
+0

Bạn cũng phải xác định một lớp bắt nguồn từ Kiểm soát và triển khai giao diện IDataGridViewEditingControl. –

+0

@AngshumanAgarwal Như tôi đã đề cập trong câu hỏi của mình - Tôi không muốn chỉnh sửa, tôi chỉ muốn hiển thị kiểm soát người dùng của mình cho tất cả các hàng trong một cột. – karephul

+0

tôi không hiểu chính xác ... nhưng bạn muốn hiển thị giá trị của các ô không hiển thị của datagridview cho người dùng? (tức là khi người dùng nhấp một lần lên ô) nếu vậy, chỉ cần sử dụng ToolTip với SQLQuery hoặc LINQ – sihirbazzz

Trả lời

4

Đầu tiên Hãy thử: Tôi đã cố gắng đặt điều khiển người dùng trên lưới nơi tôi cần. Sự cố: Việc cuộn chế độ xem lưới dữ liệu yêu cầu sắp xếp lại tất cả các điều khiển người dùng đó. Kết quả - Bị từ chối.

Lần thử thứ hai: Tôi đã tạo điều khiển người dùng và vẽ nó trong ô thích hợp. Kết quả - hoạt động cho đến nay.

Tôi chỉ overrode PaintOnClick phương thức DataGridViewCell trong lớp CustomCell.

public class CustomeCell : DataGridViewCell 
{ 
    public override Type ValueType 
    { 
     get { return typeof(CustomUserControl); } 
    } 

    protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) 
    { 
     var ctrl = (CustomUserControl) value; 
     var img = new Bitmap(cellBounds.Width, cellBounds.Height); 
     ctrl.DrawToBitmap(img, new Rectangle(0, 0, ctrl.Width, ctrl.Height)); 
     graphics.DrawImage(img, cellBounds.Location); 
    } 

    protected override void OnClick(DataGridViewCellEventArgs e) 
    { 
     List<InfoObject> objs = DataGridView.DataSource as List<InfoObject>; 
     if (objs == null) 
      return; 
     if (e.RowIndex < 0 || e.RowIndex >= objs.Count) 
      return; 

     CustomUserControl ctrl = objs[e.RowIndex].Ctrl; 
     // Take any action - I will just change the color for now. 
     ctrl.BackColor = Color.Red; 
     ctrl.Refresh(); 
     DataGridView.InvalidateCell(e.ColumnIndex, e.RowIndex); 
    } 
} 

Ví dụ ám chỉ rằng CustomControl trong CustomCell của CustomColumn;). Khi người dùng nhấp vào ô, số OnClick của CustomCell sẽ xử lý nhấp chuột. Lý tưởng nhất, tôi muốn ủy quyền rằng nhấp vào điều khiển người dùng tùy chỉnh CustomControl - điều này sẽ xử lý sự kiện như thể đó là một lần nhấp vào chính nó (điều khiển người dùng tùy chỉnh có thể lưu trữ nội bộ nhiều điều khiển).

public class CustomColumn : DataGridViewColumn 
{ 
    public CustomColumn() : base(new CustomeCell()) { } 

    public override DataGridViewCell CellTemplate 
    { 
     get { return base.CellTemplate; } 
     set 
     { 
      if (value != null && !value.GetType() 
       .IsAssignableFrom(typeof (CustomeCell))) 
       throw new InvalidCastException("It should be a custom Cell"); 
      base.CellTemplate = value; 
     } 
    } 
} 
+0

Tôi kết hợp giải pháp này với mô hình trọng lượng. Thật tuyệt vời - công trình tuyệt vời. – karephul

1

Điều khiển DataGridView chỉ hỗ trợ hiển thị điều khiển thực tế khi ô ở chế độ chỉnh sửa. Điều khiển DataGridView không được thiết kế để hiển thị nhiều điều khiển hoặc lặp lại một bộ điều khiển mỗi hàng. Điều khiển DataGridView vẽ một biểu diễn của điều khiển khi ô không được chỉnh sửa. Biểu diễn này có thể chi tiết như bạn muốn. Ví dụ, DataGridViewButtonCell vẽ một nút bất kể ô đang được chỉnh sửa hay không.

Tuy nhiên, bạn có thể thêm các điều khiển thông qua phương pháp DataGridView.Controls.Add(), và thiết lập vị trí và kích thước để làm cho họ lưu trữ trong các tế bào của họ, but showing controls in all cells regardless of editing make no sense.

đọc here

[Update - Từ Prog Mgr MS DataGridView Team]

http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/394e04a8-d918-4fdd-be03-dfa13f6a1e66?persist=True

+1

MS không hỗ trợ điều gì đó khác - nhưng tôi không đồng ý với "nhưng hiển thị các điều khiển trong tất cả các ô bất kể chỉnh sửa không có ý nghĩa. " - Xem xét bạn đang xem danh sách đơn đặt hàng của khách hàng - mỗi đơn đặt hàng có thể có các thông báo khác nhau (không có khoảng không quảng cáo, địa chỉ không đầy đủ, thứ tự trùng lặp, đặt hàng lại .. v.v) Tôi muốn người dùng của mình "xem" các thông báo này - lý tưởng trong cột Thông báo! - không thể chỉnh sửa chúng !! - nhưng có thể xem thêm chi tiết nếu họ nhấp vào một trong số họ. – karephul

+0

Thú vị! Bạn có thể đọc các nhận xét của _DataGridView Program Manager. Tôi đã cập nhật câu trả lời với liên kết msdn. –

+0

Tôi không đồng ý với "nhưng hiển thị các điều khiển trong tất cả các ô bất kể chỉnh sửa không có ý nghĩa gì." Tôi chỉ tìm thấy câu hỏi này bởi vì tôi muốn đặt một nút tùy chỉnh trong một ô để thực hiện một số hành động trên hàng đã chọn. Nếu điều đó không có ý nghĩa với bạn, tại sao có một DataGridViewButtonCell? – tapatio

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