2012-04-26 19 views
8

Mam winForm z formantem DataGridView. Zawiera 5 kolumn, jedną z nich jest kolumna CheckBox. Chcę włączyć/wyłączyć komórkę checkbox tej kolumny na podstawie wartości obecnej w innej kolumnie w tym samym wierszu.Jak wyłączyć konkretną komórkę pola wyboru w kolumnie DataBridView CheckBox

mogę wyłączyć całą kolumnę za pomocą DisabledCheckBoxCell

Ale to czyni całą kolumnę w stanie wyłączonym.

Oto urywek DataGridView,

SourceColumn | DestinationColumn
prawda                                 | włączona
prawda                                 | włączona
fałszywy                               | wyłączone

Czy ktoś ma pomysł, w jaki sposób można to osiągnąć w .Net.

Odpowiedz

0

Spróbuj użyć zdarzenia RowDataBound dla swojego GridView. Możesz rzutować zdarzenia do wiersza, znaleźć kontrolę w tym wierszu i wyłączyć go. To zdarzenie jest uruchamiane dla każdego wiersza gridview, nawet dla nagłówków i stopek, więc staraj się nie wychwytywać wyjątków. Oto kod może być przydatna

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

Chcę wyłączyć komórkę w odpowiednim wierszu, nie mogłem znaleźć włączona właściwość na komórki. Używam zdarzenia RowPostPaint. –

+0

Czy to nie wygrywa? –

+0

Obawiam się, że może nie być żadnej funkcji do wyłączenia pojedynczej komórki, ale można coś zrobić, gdy kliknie się komórkę, na przykład, aby przywrócić wartość komórki, którą chcesz wyłączyć. – Nick

20

Vijay,

DataGridViewCheckBoxColumn nie posiada właściwość o nazwie wyłączone więc zmieniając styl wyboru można by wyglądało tak, jakby to jest wyłączone. Spójrz na poniższy kod.

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

Dziękuję za odpowiedź. Działa to z kilkoma drobnymi problemami.Mam również komórki pola wyboru w nagłówkach kolumn. Wpływa to również na nich. Po przełączeniu się do innej aplikacji i powrocie do oryginalnej aplikacji interfejs użytkownika wygląda na zniekształcony. –

1

skończyło się robi coś takiego, aby uzyskać rzeczywiste pole niepełnosprawnej, aby pokazać się:

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); 
       } 
      } 
     } 
    } 
} 
Powiązane problemy