2012-04-26 35 views
8

Tôi có một winForm có điều khiển DataGridView. Nó chứa 5 cột, một trong số đó là cột CheckBox. Tôi muốn bật/tắt ô kiểm tra của cột này dựa trên giá trị hiện tại trong một cột khác tại cùng một hàng.Cách tắt ô kiểm tra ô cụ thể trong cột Hộp kiểm DataGridView

tôi có thể vô hiệu hóa toàn bộ cột bằng DisabledCheckBoxCell

Nhưng nó làm cho toàn bộ cột trong tình trạng tàn tật.

Đây là một đoạn của DataGridView,

SourceColumn | DestinationColumn
đúng                                 | kích hoạt
đúng                                 | kích hoạt
sai                               | bị vô hiệu hóa

Có ai có ý tưởng hay không, cách thức này có thể đạt được trong .Net.

Trả lời

0

Hãy thử sử dụng sự kiện RowDataBound cho GridView của bạn. Bạn có thể truyền sự kiện thành hàng, tìm điều khiển trên hàng này và tắt tính năng này. Sự kiện này kích hoạt cho mỗi hàng của chế độ xem lưới, ngay cả đối với đầu trang và chân trang, vì vậy hãy thử không bắt ngoại lệ. Dưới đây là một số mã có thể có ích cho bạn

protected void xxx_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if ((e.Row != null) && e.Row.RowType == DataControlRowType.DataRow) 
+0

Tôi muốn vô hiệu hóa tế bào trong hàng tương ứng, tôi không thể tìm được kích hoạt bất động sản trên di động. Tôi đang sử dụng sự kiện RowPostPaint. –

+0

Nó không phải là winforms? –

+0

Tôi sợ có thể không có bất kỳ chức năng nào để vô hiệu hóa một ô riêng lẻ, nhưng bạn có thể làm điều gì đó trong khi ô được nhấp, ví dụ để hoàn nguyên giá trị cho ô bạn muốn vô hiệu hóa – Nick

20

Vijay,

DataGridViewCheckBoxColumn không có tính chất gọi là khuyết tật bằng cách thay đổi phong cách của hộp, bạn có thể làm cho nó trông giống như nếu nó bị vô hiệu hóa. Nhìn vào đoạn mã sau.

private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) 
    { 
     if (e.RowIndex == 1) 
     { 
      DataGridViewCell cell=dataGridView1.Rows[e.RowIndex].Cells[0]; 
      DataGridViewCheckBoxCell chkCell = cell as DataGridViewCheckBoxCell; 
      chkCell.Value = false; 
      chkCell.FlatStyle = FlatStyle.Flat; 
      chkCell.Style.ForeColor = Color.DarkGray; 
      cell.ReadOnly = true; 

     } 

    } 
+0

Cảm ơn bạn đã trả lời. Điều này đang làm việc với một số vấn đề nhỏ.Tôi cũng có các ô kiểm tra trong các tiêu đề cột. Điều này cũng ảnh hưởng đến chúng. Khi tôi chuyển sang ứng dụng khác và quay trở lại ứng dụng ban đầu, giao diện người dùng có vẻ bị méo. –

1

tôi đã kết thúc làm một cái gì đó như thế này để có được một hộp kiểm khuyết tật thực tế để xuất hiện:

using System.Windows.Forms.VisualStyles; 

public partial class YourForm : Form 
{ 

    private static readonly VisualStyleRenderer DisabledCheckBoxRenderer; 

    static YourForm() 
    { 
     DisabledCheckBoxRenderer = new VisualStyleRenderer(VisualStyleElement.Button.CheckBox.UncheckedDisabled); 
    } 

    private void dataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) 
    { 
     if (e.RowIndex > -1) 
     { 
      int checkBoxColumnIndex = this.yourCheckBoxColumn.Index; 
      var checkCell = (DataGridViewCheckBoxCell)this.dataGridView[checkBoxColumnIndex, e.RowIndex]; 
      var bounds = this.dataGridView.GetCellDisplayRectangle(checkBoxColumnIndex , e.RowIndex, false); 

      // i was drawing a disabled checkbox if i had set the cell to read only 
      if (checkCell.ReadOnly) 
      { 
       const int CheckBoxWidth = 16; 
       const int CheckBoxHeight = 16; 

       // not taking into consideration any cell style paddings 
       bounds.X += (bounds.Width - CheckBoxWidth)/2; 
       bounds.Y += (bounds.Height - CheckBoxHeight)/2; 
       bounds.Width = CheckBoxWidth; 
       bounds.Height = CheckBoxHeight; 

       if (VisualStyleRenderer.IsSupported) 
       { 

        // the typical way the checkbox will be drawn 
        DisabledCheckBoxRenderer.DrawBackground(e.Graphics, bounds); 
       } 
       else 
       { 

        // this method is only drawn if the visual styles of the application 
        // are turned off (this is for full support) 
        ControlPaint.DrawCheckBox(e.Graphics, bounds, ButtonState.Inactive); 
       } 
      } 
     } 
    } 
} 
Các vấn đề liên quan