仅允许在DataGridView中选中一个复选框

时间:2016-02-11 21:39:42

标签: c# sql winforms checkbox datagridview

我有一个datagridview填充来自数据库的数据。第一列是一个checkboxcolumn(从数据库中检索的此列的数据是BIT类型),我希望用户只检查一个。如果用户选择其他一个,则必须取消选中第一个。

我看过很多代码而且都没有。

我能做什么?

是带有SQL SERVER的Winforms C#应用程序。

6 个答案:

答案 0 :(得分:1)

private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
   // Whatever index is your checkbox column
   var columnIndex = 0;
   if (e.ColumnIndex == columnIndex)
   {
      // If the user checked this box, then uncheck all the other rows
      var isChecked = (bool)dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
      if (isChecked)
      {
         foreach (DataGridViewRow row in dataGridView.Rows)
         {
            if (row.Index != e.RowIndex)
            {
               row.Cells[columnIndex].Value = !isChecked;
            }
         }
      }
   }
}

答案 1 :(得分:0)

您必须在 DGV 上将 VirtualMode 设置为 TRUE ,才能只允许一个复选框。

答案 2 :(得分:0)

订阅CellContentClick并添加dataGridView.EndEdit()以获得更好的用户体验(单元格不必失去要触发的事件的焦点):

private void ChangeCheckedStateOfOtherCheckboxesInDgv(object sender, DataGridViewCellEventArgs e)
{
    const int chkBoxColumnIndex = 0;

    var dataGridView = (DataGridView)sender;

    if (e.ColumnIndex == chkBoxColumnIndex)
    {
        dataGridView.EndEdit();

        var isChecked = (bool)dataGridView[e.ColumnIndex, e.RowIndex].Value;

        if (isChecked)
        {
            foreach (DataGridViewRow row in dataGridView.Rows)
            {
                if (row.Index != e.RowIndex)
                    row.Cells[chkBoxColumnIndex].Value = !isChecked;
            }
        }
    }
}

答案 3 :(得分:0)

VB网络版本

Private Sub dataGridView_CellValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DG_SubSyncs.CellValueChanged
    Dim columnIndex As Integer = 0
       If (e.ColumnIndex = columnIndex) Then
          'If the user checked this box, then uncheck all the other rows
          Dim isChecked As Boolean = CBool(DG_SubSyncs.Rows(e.RowIndex).Cells(e.ColumnIndex).Value)
           If (isChecked) Then
              For Each row In DG_SubSyncs.Rows
                  If (row.Index <> e.RowIndex) Then
                      row.Cells(columnIndex).Value = Not isChecked
                     End If
               Next
           End If
       End If
   End Sub

答案 4 :(得分:0)

这里是经过稍微清理的版本。我的复选框列是动态添加的,并且始终是网格中的最后一列,但是您会明白:

    private void ProfilesGrid_CellContentClick(object sender, [NotNull] DataGridViewCellEventArgs e)
    {
        DataGridView dataGridView = (DataGridView)sender;

        int columnCount = dataGridView.Columns.GetColumnCount(DataGridViewElementStates.None) - 1;

        if (e.ColumnIndex != columnCount)
        {
            return;
        }

        dataGridView.EndEdit();

        if (!(bool) dataGridView[e.ColumnIndex, e.RowIndex].Value)
        {
            return;
        }

        foreach (DataGridViewRow row in dataGridView.Rows.Cast<DataGridViewRow>().Where(row => row.Index != e.RowIndex))
        {
            row.Cells[columnCount].Value = false;
        }
    }

答案 5 :(得分:0)

props.handleClose