在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(我分别命名为grid
和colRadioButton
)。我不确定这是否重要,但我的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 中选择多个字段