安静的毛豆 · 详解小红书引流小技巧和矩阵玩法_小红书矩阵- ...· 2 月前 · |
坐怀不乱的猕猴桃 · 北部山水新城再迎大开发 ...· 7 月前 · |
近视的橙子 · 【使命漫画】2020-01:西部荒野-小米游戏中心· 1 年前 · |
追风的香菜 · 超豪车不愁卖!劳斯莱斯CEO认为人们意识到要 ...· 1 年前 · |
追风的豆腐 · 庄则栋复刻杯 - 抖音· 1 年前 · |
我有一个显示贷款分期付款的
datagridview
。我创建了一个
datagridviewcheckbox
列,这样我就可以选择我想要支付的所有分期付款。
这是数据网格的屏幕:
我的问题是,我需要禁用付费安装的复选框。在这种情况下,当"Restante“(要支付的剩余部分)为
= 0
时。
我读过一些帖子,他们使用paint事件来不显示复选框单元格,但我不喜欢这个解决方案。我想隐藏复选框单元格,但我不知道是否可以这样做。
这就是我尝试过的:
foreach (DataGridViewRow row in dgv_Cuotas.Rows)
if (Convert.ToDecimal(dgv_Cuotas.Rows[row.Index].Cells[17].Value) == 0)
dgv_Cuotas.Rows[row.Index].Cells[16].Visible = false;
}
显然这不起作用,我得到了一个编译器错误消息,说明该属性是只读的。
有人知道如何将复选框单元格设置为不可见吗?
为了以防万一,我附加了
DataGridViewCheckboxColumn
创建代码:
DataGridViewCheckBoxColumn chbox = new DataGridViewCheckBoxColumn();
chbox.CellTemplate = new DataGridViewCheckBoxCell();
chbox.HeaderText = "";
chbox.Name = "Seleccionar";
chbox.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
chbox.FlatStyle = FlatStyle.Standard;
dgv_Cuotas.Columns.Insert(16, chbox);
dgv_Cuotas.Columns[16].DisplayIndex = 0;
编辑:
一些注意事项:
我使用单元格内容单击事件来处理复选框,所以readonly不起作用。我想要的是隐藏复选框:
private void dgv_Cuotas_CellContentClick(object sender, DataGridViewCellEventArgs e)
if (e.RowIndex == -1)
return;
if (dgv_Cuotas.Columns[e.ColumnIndex].Name == "Seleccionar")
DataGridViewRow row = dgv_Cuotas.Rows[e.RowIndex];
DataGridViewCheckBoxCell cellSeleccion = row.Cells["Seleccionar"] as DataGridViewCheckBoxCell;
int n_cuota = Convert.ToInt32(dgv_Cuotas[2, dgv_Cuotas.CurrentRow.Index].Value);
Cuota cuota_seleccionada = new Cuota();
cuota_seleccionada = Lista_cuotas.Where(x => x.num_cuota == n_cuota).First();
if (cellSeleccion != null && Convert.ToBoolean(cellSeleccion.Value) == true)
cellSeleccion.Value = false;
Actualizar_cuotas_seleccionadas(false, cuota_seleccionada);
if (cellSeleccion != null && Convert.ToBoolean(cellSeleccion.Value) == false)
cellSeleccion.Value = true;
Actualizar_cuotas_seleccionadas(true, cuota_seleccionada);
}
另一方面,我已经在使用Onpaint事件了。它是遗传的,这就是我尽量避免使用它的原因。
使用单元格的
ReadOnly
属性禁用任何修改。
如果要将其转换为隐藏,则需要覆盖单元格的绘制代码。
可以,您可以通过将
DataGridViewCheckBoxCell
转换为
DataGridViewTextBoxCell
来执行此操作
foreach (DataGridViewRow row in dataGridView1.Rows)
if (dataGridView1.Rows[row.Index].Cells[17].EditedFormattedValue.ToString().Length == 0) // if (string.IsNullOrWhiteSpace(dataGridView1.Rows[row.Index].Cells[4].EditedFormattedValue.ToString()))
break;
if (Convert.ToDecimal(dataGridView1.Rows[row.Index].Cells[17].EditedFormattedValue) == 0)
dataGridView1.Rows[row.Index].Cells[16].Value = null;
dataGridView1.Rows[row.Index].Cells[16] = new DataGridViewTextBoxCell();
//dgv_Cuotas.Rows[row.Index].Cells[16] = new DataGridViewCheckBoxCell();
}
有几种方法可以实现你想要的。
例如,可以使用单元格的Readonly属性来避免用户更改值并将控件的外观更改为灰色:
为复选框单元格赋值。然后将其转换为具有新值的TextBox。对我很管用。
dataGridView1.Rows[row.Index].Cells[16].Value = false;
dataGridView1.Rows[row.Index].Cells[16] = new DataGridViewTextBoxCell();
dataGridView1.Rows[row.Index].Cells[16].Value = "";
我接受了spajce的答案,并对其进行了一些调整,使其适用于我。
for (var i = 0; i < datagridview1.Count; i++)
if ((bool)datagridview1[0, i])
datagridview1[0, i] = new DataGridViewTextBoxCell
Style = { ForeColor = Color.Transparent,
SelectionForeColor = Color.Transparent }
}
我们基本上是在遍历各行,并寻找一个“true”复选框。如果选中它,那么我们将框转换为文本框,并将其文本颜色设置为透明,这样单元格就看起来是空的。我希望这能帮助每个有这个问题的人,我花了几个小时试图找到一个可行的答案。
我试过查莉的方法:
dataGridView1.Rows[row.Index].Cells[16].Value = false;
dataGridView1.Rows[row.Index].Cells[16] = new DataGridViewTextBoxCell();
dataGridView1.Rows[row.Index].Cells[16].Value = "";
我得到的错误较少,但仍然不断得到它们。因此,我尝试单独实例化新的DataGridViewTextBoxCell,这对我来说很有用(我也不需要设置复选框单元格的值):
DataGridViewTextBoxCell c = new DataGridViewTextBoxCell();
c.Value = "";
dataGridView1.Rows[row.Index].Cells[16] = c;
希望这对某些人有帮助!
一种简单而有效的替代方法是使用chkbox ThreeState属性。在下面的代码中,如果我的对象没有电子邮件地址,那么我不想让用户勾选发送电子邮件的复选框。为此,复选框值被设置为未知和只读,这意味着它将显示为“不可选”,并且用户不能修改。
chk = DirectCast(row.Cells(m_idxEmailChecked), DataGridViewCheckBoxCell)
If String.IsNullOrEmpty(contact.EmailAddress) Then
chk.Value = enumTristate.Unknown
chk.ReadOnly = True
chk.ThreeState = False