【问题标题】:Hide some datagridview checkbox cell隐藏一些datagridview复选框单元格
【发布时间】:2013-01-02 14:46:35
【问题描述】:

我有一个datagridview 显示分期贷款。我创建了一个datagridviewcheckbox 列,这样我就可以选择我想要支付的所有分期付款。

这是数据网格的屏幕:

我的问题是我需要禁用已付款的复选框。在这种情况下,当“Restante”(还剩什么)是= 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;

编辑:

一些注意事项:

我使用单元格内容单击事件来处理复选框,因此 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);
            }
            else
            {
                if (cellSeleccion != null && Convert.ToBoolean(cellSeleccion.Value) == false)
                {
                    cellSeleccion.Value = true;
                    Actualizar_cuotas_seleccionadas(true, cuota_seleccionada);
                }
            }
        }

另一方面,我已经在使用 Onpaint 事件了。它是继承的,这就是为什么我试图避免使用它。

【问题讨论】:

    标签: c# winforms datagridview datagridviewcheckboxcell


    【解决方案1】:

    为复选框单元格赋值。然后将其转换为具有新值的文本框。 为我工作。

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

    【讨论】:

      【解决方案2】:

      是的,您可以通过将 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();
      
                  }
                  else
                  {
                      //dgv_Cuotas.Rows[row.Index].Cells[16] = new DataGridViewCheckBoxCell();
                  }
              }
      

      【讨论】:

      • 我在运行时收到此错误:单元格的格式化值类型错误。 ://
      • 我更新了我的答案.. 也尝试检查您的单元格的格式化值
      • 因为您试图将字符串转换为没有值或空字符串的十进制。请尝试理解:)
      • 第 17 列总是有一个值,这不是错误的原因。问题在这里: dataGridView1.Rows[row.Index].Cells[16].Value = null; dataGridView1.Rows[row.Index].Cells[16] = new DataGridViewTextBoxCell();我开始调试它,发现在那行代码之前,我的datagridview有18列,但之后有19列。错误一定与此相关。
      • 使用 DataError,我在第 16 列第 0 行收到错误。显示和格式错误。单元格的格式化值类型错误。
      【解决方案3】:

      使用单元格的ReadOnly 属性禁用任何修改。

      如果你想把它变成隐藏,你需要覆盖单元格的绘制代码。

      【讨论】:

      • 如果onclick 事件是只读的,为什么不修改它不做任何事情呢?如果要隐藏它,请从 checkboxcell 继承另一个单元格,并将它的新实例分配到您想要的位置。
      • 我该怎么做?我的意思是,隐藏的东西。
      【解决方案4】:

      尝试隐藏它并保留该值,这应该可以防止运行时错误。

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

      【讨论】:

      • 欢迎来到stackoverflow。请确保您充分解释您的答案。对于这样一个已有数年之久的问题,并且已经确定了答案,还请解释您的答案有何不同。
      • 它使复选框不可见。
      【解决方案5】:

      我接受了 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 }
                  };
              }
      }
      

      我们基本上是在遍历行并寻找一个“真正的”复选框。如果它被选中,那么我们会将框转换为文本框并将其文本颜色设置为透明,以便单元格看起来是空的。我希望这对遇到这个问题的每个人都有帮助,我花了几个小时试图找到一个可行的答案。

      【讨论】:

        【解决方案6】:

        有几种方法可以实现你想要的。

        例如,您可以使用单元格的 Readonly 属性来避免用户更改值并将控件的外观更改为灰色:

        C# DataGridViewCheckBoxColumn Hide/Gray-Out

        【讨论】:

        • Ready only 对我来说没用,我使用单元格 onclick 事件处理复选框的状态。因此,使其只读非常容易。我想要的是隐藏复选框。我读了那篇文章,但我认为可能有一个更简单的解决方案。我已经在使用 onpaint 事件,不想用新代码搞砸它,因为它是继承的。
        【解决方案7】:

        一个简单而有效的替代方法是使用 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
        

        注意,这还需要在复选框上设置几个相关的 ThreeState 属性。

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

        祝你好运。

        【讨论】:

          【解决方案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;
          

          希望对某人有所帮助!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-06
            • 2020-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多