2016-09-17 2 views
2

У меня есть база данных, которая выглядит, как этотплощади Заполненный вместо цвета в DataGridView Checkbox

Таблица Название: ri_closure enter image description here

как то, что вы видите на изображении выше всех столбцов, кроме Month являются TinyInt(1) и Month является Varchar теперь у меня есть код здесь

Dim con1 As MySqlConnection = New MySqlConnection("server=192.168.2.87;userid=root;password=admin1950;database=inventory") 
     Dim sql1 As MySqlCommand = New MySqlCommand("Select * from ri_closure", con1) 
     Dim ds1 As DataSet = New DataSet 
     Dim adapter1 As MySqlDataAdapter = New MySqlDataAdapter 
     con1.Open() 
     adapter1.SelectCommand = sql1 
     adapter1.Fill(ds1, "MyTable") 
     DataGridView2.DataSource = ds1.Tables(0) 
     con1.Close() 
     ds1.Tables(0).Columns(2).DataType = GetType(Boolean) 
     Me.DataGridView2.Columns(1).Frozen = True 
     Dim i As Integer 
     For i = 0 To DataGridView2.Columns.Count - 1 
      DataGridView2.Columns.Item(i).SortMode = DataGridViewColumnSortMode.Programmatic 
     Next 
     DataGridView2.Columns(0).Visible = False 
     DataGridView2.Columns(1).DefaultCellStyle.BackColor = Color.LightBlue 

Теперь это то, что он выглядит

enter image description here

Теперь вы видите выход, и я уверен, что вы не хотите, чтобы красные. Вызывает раздражение в глазах, и вот мой код для этого

For Each rw As DataGridViewRow In DataGridView2.Rows 
      For ii As Integer = 2 To rw.Cells.Count - 1 
       If rw.Cells(ii).Value = False Then 
        rw.Cells(ii).Style.BackColor = Color.Red 
       ElseIf rw.Cells(ii).Value = True Then 
        rw.Cells(ii).Style.BackColor = Color.White 
       End If 
      Next 
     Next 

Теперь вот мой вопрос, и я надеюсь, что это возможно. Я хочу сделать что-то вроде этого, а не отменено, и превратить ячейку в красный. Как я могу сделать неэкранную ячейку такой.

enter image description here

вместо пустой флажок будет выглядеть так же, как на картинке выше.

и еще один. Я надеюсь, что тот, который будет сгенерировать заполненный флажок, заменит значение uncheked, потому что у меня есть код для проверки этого.

Стараюсь некоторый код, и это выход

enter image description here

TYSM для будущей помощи

ответ

1

Вы можете настроить картину DataGridViewCheckBox колонки обработки CellPainting события DataGridView. Затем вы можете использовать CheckBoxRenderer, чтобы нарисовать флажок в желаемом состоянии.Государство, которое вы хотите показать для неконтролируемого состояния флажка CheckBoxState.MixedNormal:

Private Sub CellPainting(ByVal sender As Object, _ 
    ByVal e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting 
    If (e.ColumnIndex = 0 AndAlso e.RowIndex >= 0) Then 
     Dim value = DirectCast(e.FormattedValue, Nullable(Of Boolean)) 
     e.Paint(e.CellBounds, DataGridViewPaintParts.All And _ 
           Not (DataGridViewPaintParts.ContentForeground)) 
     Dim state = IIf((value.HasValue And value.Value), _ 
         VisualStyles.CheckBoxState.CheckedNormal, _ 
         VisualStyles.CheckBoxState.MixedNormal) 
     Dim size = RadioButtonRenderer.GetGlyphSize(e.Graphics, state) 
     Dim location = New Point((e.CellBounds.Width - size.Width)/2, _ 
           (e.CellBounds.Height - size.Height)/2) 
     location.Offset(e.CellBounds.Location) 
     CheckBoxRenderer.DrawCheckBox(e.Graphics, location, state) 
     e.Handled = True 
    End If 
End Sub 

Чтобы проверить решение, которое вы можете добавить столбец сетки таким образом:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
    Handles MyBase.Load 
    Dim C1 = New DataGridViewCheckBoxColumn() 
    C1.DataPropertyName = "C1" 
    C1.HeaderText = "C1" 
    C1.TrueValue = 1 
    C1.FalseValue = 0 
    Me.DataGridView1.Columns.Add(C1) 
    Me.DataGridView1.Rows.Add(DirectCast(1, Object)) 
    Me.DataGridView1.Rows.Add(DirectCast(0, Object)) 
    Me.DataGridView1.AllowUserToAddRows = False 
End Sub 

И это будет результатом :

enter image description here

рисовать неконтролируемый (фактически смешанное состояние) в красном цвете, после вызова CheckBoxRenderer.DrawCheckBox нас е этот код:

If (state = VisualStyles.CheckBoxState.MixedNormal) Then 
    Dim rect = New Rectangle(location, size) 
    rect.Inflate(-2, -2) 
    e.Graphics.FillRectangle(Brushes.Red, rect) 
End If 

enter image description here

+0

Сэр пожалуйста, вы можете encorporate код на форме нагрузки на мой код? –

+0

Это не имеет никакого отношения к загрузке формы. Обработать событие «CellPainting» сетки. 'If ​​(e.ColumnIndex = 0' означает использование пользовательской логики рисования для столбца с индексом 0. –

+0

Я пробовал ваш код sir, а первый второй столбец - единственная строка, которая имеет право поставить, я обновлю свой пост sir –

0

Вы можете использовать DataGridView «s VirtualMode, а затем использовать CellValueNeeded событие для отображения вашего собственного контента.

Вот что я предлагаю вам нужно сделать,

  1. Решают изображение, которое будет отображаться вместо флажка (например, зеленый тик)
  2. Установите переключатель DataGridView «s VirtualMode собственности на true
  3. После привязывая DataGridView к вашим DataTable итераторам за все месячные столбцы, установите DataProperptyName в качестве пустой строки (это важно для запуска события)
  4. Создайте обработчик событий для события DataGridViewCellValueNeeded, в этом случае вы получите индекс столбца и индекс строки в параметрах событий. Используйте это, чтобы найти фактическое значение позади, а затем вернуть изображение зеленого тика (используя e.Value) или вернуть пустое изображение в зависимости от значения.
Смежные вопросы