隐藏一些datagridview的复选框单元格(Hide some datagridview che

2019-07-17 18:48发布

我有一个datagridview呈现出贷款的分期付款。 我创建了一个datagridviewcheckbox列这样的话,我可以选择我想要的支付分期付款。

这是数据网格的屏幕:

我的问题是,我需要禁用付费intallments的复选框。 在这种情况下,当“Restante”(what's左付)为= 0

我看了一些帖子,他们使用的油漆事件不显示该复选框细胞,但我不喜欢这种解决方案。 我想隐藏复选框单元格的,但我不知道是否有可能做到这一点。

那是我的尝试:

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;

编辑:

一些注意事项:

我用的是单元格的内容点击事件处理的复选框,所以只读不会工作。 我要的是隐藏的复选框:

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);
            }
            else
            {
                if (cellSeleccion != null && Convert.ToBoolean(cellSeleccion.Value) == false)
                {
                    cellSeleccion.Value = true;
                    Actualizar_cuotas_seleccionadas(true, cuota_seleccionada);
                }
            }
        }

在另一方面,I'm已经使用OnPaint事件。 它继承了,这就是为什么我正尝试避免使用它。

Answer 1:

是的,你可以通过转换为此DataGridViewCheckBoxCellDataGridViewTextBoxCell

        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();

            }
            else
            {
                //dgv_Cuotas.Rows[row.Index].Cells[16] = new DataGridViewCheckBoxCell();
            }
        }


Answer 2:

值分配给复选框细胞。 然后用新的值转换为文本框。 为我工作。

dataGridView1.Rows[row.Index].Cells[16].Value = false;
dataGridView1.Rows[row.Index].Cells[16] = new DataGridViewTextBoxCell();
dataGridView1.Rows[row.Index].Cells[16].Value = "";


Answer 3:

使用电池的ReadOnly属性魔鬼任何修改。

如果你想打开它看不见,你需要重写代码画的细胞。



Answer 4:

我把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 }
            };
        }
}

我们基本上通过迭代行,并寻找一个“真正的”检查框。 如果它选择了,那么我们的框转换为文本框,并让细胞看上去空了的文字颜色设置为透明。 我希望这有助于大家谁都有这个问题,我花了几个小时试图找到一个可行的答案。



Answer 5:

有几种方式来完成你想要的东西。

例如,你可以使用电池的只读属性,以避免用户更改值,改变控制一下变灰的appeareance:

C#DataGridViewCheckBoxColumn隐藏/灰化



Answer 6:

一个简单而有效的方法是使用chkbox ThreeState属性。 在下面的代码,如果我的对象不具有一个电子邮件地址,然后我不想让用户勾选复选框用于发送电子邮件。 要做到这一点,该复选框值设置为未知的和只读的,这意味着它显示为“不可选择”的用户不能修改。

chk = DirectCast(row.Cells(m_idxEmailChecked), DataGridViewCheckBoxCell)
If String.IsNullOrEmpty(contact.EmailAddress) Then
  chk.Value = enumTristate.Unknown
  chk.ReadOnly = True
Else
  chk.ThreeState = False
End If

请注意,这也要求要在复选框设置几个相关联的三态特性。

        .ValueType = GetType(enumTristate)
        .TrueValue = enumTristate.True
        .FalseValue = enumTristate.False
        .IndeterminateValue = enumTristate.Unknown
        .ThreeState = True

祝好运。



Answer 7:

试着隐藏它和值保持,应该防止运行时错误。

dataGridView1.Rows[row.Index].Cells[16].Style.Padding =
new Padding(dataGridView1.Rows[row.Index].Cells[16].OwningColumn.Width, 0, 0, 0);


Answer 8:

我试过查理的方式:

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;

希望可以帮助别人!



文章来源: Hide some datagridview checkbox cell