在datagridview中如何使用checkbox作为radiobutton?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在datagridview中如何使用checkbox作为radiobutton?相关的知识,希望对你有一定的参考价值。

IDE:Visual Studio c#,Winforms Application。

我已经投入了大约12个小时,但没有取得成功。由于DataGridView不提供radiobutton类型的细胞。所以我试图使用复选框单元作为无线电功能。

即我只想检查列中的一个复选框。

看图像:

看起来很简单,但相信我并不像我们想的那么简单。在给予回复之前,请测试代码。

以下是我尝试的示例测试代码:

代码1

////start
if (e.RowIndex != -1)
{
    if (dataGridView1.Rows[e.RowIndex].Cells[0].Value != null && dataGridView1.CurrentCell.ColumnIndex == 0) //null check
    {
        if (e.ColumnIndex == 0)
        {
            if (((bool)dataGridView1.Rows[e.RowIndex].Cells[0].Value == true))
            {

                for (int k = 0; k <= 4; k++)
                {
                    //uncheck all other checkboxes but keep the current as checked
                   if (k == dataGridView1.CurrentRow.Index)
                    {
                        dataGridView1.Rows[k].Cells[0].Value = false;
                 }
                    //if (gvTeam1.Rows[k].Cells[2].Selected != null)
                    //if(k !=e.RowIndex)              

                }

                // gvTeam1.Rows[e.RowIndex].Cells[2].Value = false; // keep the current captain box checked
            }
        }
        //}


        // gvTeam1.Rows[rowPointerTeam1].Cells[2].Value = true;
    }
}
//end
// here gvTeam1 is Datagridview1

代码2:在datagridview1上测试

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    if (dataGridView1.CurrentCell.ColumnIndex == 0)
    {
        for (int i = 0; i < 8; i++)
        {
            //if (i != dataGridView1.CurrentCell.RowIndex)
                dataGridView1.Rows[i].Cells[0].Value = false;              

        }
        dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[0].Value = true;
    }
}
答案
    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        //clean al rows
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            row.Cells["Select"].Value = false;
        }

        //check select row
        dataGridView1.CurrentRow.Cells["Select"].Value = true;
     }
另一答案

我知道我迟到了,但这里是代码使用实际的单选按钮而不是复选框。

信用: 感谢Arsalan Tamiz的博客文章,此代码基于此文章。 http://arsalantamiz.blogspot.com/2008/09/using-datagridview-checkbox-column-as.html 还要感谢M. Viper's answer奠定了一些基础工作。

步骤1:将DataGridView控件添加到面板并添加CheckBoxColumn(我分别命名为gridcolRadioButton)。我不确定这是否重要,但我的DataGridView的EditMode属性设置为EditOnEnter

第2步:为CellPainting事件创建事件处理程序。

private void grid_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.ColumnIndex == colRadioButton.Index && e.RowIndex >= 0)
    {
        e.PaintBackground(e.ClipBounds, true);

        // TODO: The radio button flickers on mouse over.
        // I tried setting DoubleBuffered on the parent panel, but the flickering persists.
        // If someone figures out how to resolve this, please leave a comment.

        Rectangle rectRadioButton = new Rectangle();
        // TODO: Would be nice to not use magic numbers here.
        rectRadioButton.Width = 14;
        rectRadioButton.Height = 14;
        rectRadioButton.X = e.CellBounds.X + (e.CellBounds.Width - rectRadioButton.Width) / 2;
        rectRadioButton.Y = e.CellBounds.Y + (e.CellBounds.Height - rectRadioButton.Height) / 2;

        ButtonState buttonState;
        if (e.Value == DBNull.Value || (bool)(e.Value) == false)
        {
            buttonState = ButtonState.Normal;
        }
        else
        {
            buttonState = ButtonState.Checked;
        }
        ControlPaint.DrawRadioButton(e.Graphics, rectRadioButton, buttonState);

        e.Paint(e.ClipBounds, DataGridViewPaintParts.Focus);

        e.Handled = true;
    }
}

步骤3:处理CurrentCellDirtyStateChanged事件以取消选中上一个选择。这与M. Viper's answer基本相同。

private void radioButtonChanged()
{
    if (grid.CurrentCell.ColumnIndex == colRadioButton.Index)
    {
        foreach (DataGridViewRow row in grid.Rows)
        {
            // Make sure not to uncheck the radio button the user just clicked.
            if (row.Index != grid.CurrentCell.RowIndex)
            {
                row.Cells[colRadioButton.Index].Value = false;
            }
        }
    }
}

private void grid_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    radioButtonChanged();
}

步骤4 :(可选)处理CellClick事件以允许用户通过单击单元格中的任何位置来检查单选按钮,而不是直接单击单选按钮。

private void grid_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == colRadioButton.Index)
    {
        DataGridViewCheckBoxCell cell = (DataGridViewCheckBoxCell)grid.Rows[e.RowIndex].Cells[colRadioButton.Index];
        cell.Value = true;
        radioButtonChanged();
    }
}
另一答案

试试这个,

private void dataGridView1_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
{
    UpdateCellValue(e.RowIndex);
}
private void UpdateCellValue(int CurrentRowIndex)
{
    if (CurrentRowIndex < 0)
        return;
    dataGridView1.Rows[CurrentRowIndex].Cells[0].Value = true;
    dataGridView1.EndEdit();
    if (CurrentRowIndex > -1)
    {
        for (int row = 0; row < dataGridView1.Rows.Count; row++)
        {
            if (CurrentRowIndex != row)
                dataGridView1.Rows[row].Cells[0].Value = false;
        }
    }            
}
另一答案

不希望更改控件的默认行为。我们在我的一个项目中经历了这条道路,结果并不富有成效。与单选按钮不同,CheckBox控件用于多选。我建议你为RadioButtonCell写一个自定义的DataGridView

这篇Build a Custom RadioButton Cell and Column for the DataGridView Control文章是一个很好的起点。

另一答案

将此代码粘贴到datagridview cellcontentclick上,它将作为单选按钮使用

        int row_index = e.RowIndex;
        for (int i = 0; i < dataGridView1.Rows.Count; i++)
        {
            if (row_index != i)
            {
                dataGridView1.Rows[i].Cells["Column1"].Value = false;
            }
        }

以上是关于在datagridview中如何使用checkbox作为radiobutton?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# WinForms 中使用 LINQ 从 DataGridView 中选择多个字段

如何在DataGridView中删除数据?

如何在 DataGridView 中禁用排序?

如何在datagridview第一行新增一行

如何使用 sql Bulkcopy 在表中插入 datagridview 行

如何在 C# 中获取 DataGridView 中的主键?