11

我有一个DataGridView这是上一个问题的主题(链接)。但有时 Button 是null. 这可以。但如果它为空,有什么方法可以选择删除/添加(显示/隐藏?)按钮到DataGridViewButtonColumn按钮

像这样:

+------------+------------+
| MyText     | MyButton   |
+------------+------------+
| "do this"  | (Yes)      |
| "do that"  | (Yes)      |
| FYI 'blah' |            | <---- this is where I optionally want no button
| "do other" | (Yes)      |
+------------+------------+

这是我迄今为止尝试过的(基于这个例子

private void grdVerdict_CellFormat(object sender, DataGridViewCellFormattingEventArgs e)
{
   if (e.ColumnIndex == grdChoice.Columns["yesbutton"].Index)
   {
       if (grdVerdict[e.ColumnIndex, e.RowIndex].Value == null)
       {
            //grdVerdict[e.ColumnIndex, e.RowIndex].Visible = false; //<-says 'it is read only'
            //grdVerdict[e.ColumnIndex, e.RowIndex].Value = new DataGridTextBox(); //<- draws 'mad red cross' over whole grid
            //((Button)grdVerdict[e.ColumnIndex, e.RowIndex]).Hide; //<- won't work
       }
       else
       {
          e.Value = ((Button)grdChoice[e.ColumnIndex, e.RowIndex].Value).Text;
       }
   }
}
4

9 回答 9

13

我今天遇到了同样的“问题”。我还想隐藏某些行的按钮。在玩了一段时间之后,我发现了一个非常简单且不错的解决方案,它不需要任何重载的paint()-functions 或类似的东西:

DataGridViewCellStyle只需为这些单元格分配一个不同的值。
关键是,您padding将此新样式的属性设置为将整个按钮移出单元格可见区域的值。
而已!:-)

样本:

System::Windows::Forms::DataGridViewCellStyle^  dataGridViewCellStyle2 = (gcnew System::Windows::Forms::DataGridViewCellStyle());
dataGridViewCellStyle2->Padding = System::Windows::Forms::Padding(25, 0, 0, 0);

dgv1->Rows[0]->Cells[0]->Style = dataGridViewCellStyle2;
// The width of column 0 is 22.
// Instead of fixed 25, you could use `columnwidth + 1` also.
于 2015-03-12T12:55:26.497 回答
4

将按钮放在右侧并准备就绪

DataGridViewCellStyle  dataGridViewCellStyle2 = new DataGridViewCellStyle();
dataGridViewCellStyle2.Padding = new Padding(0, 0, 1000, 0);
row.Cells["name"].Style = dataGridViewCellStyle2;   
于 2019-07-30T01:48:54.973 回答
3

根据Tobias 的回答,我制作了一个小的静态辅助方法来通过调整单元格的填充来隐藏单元格的内容。

请注意,尽管按钮仍然是“可点击的”,因为如果用户选择单元格并按空格键,它会单击隐藏按钮,因此在处理 contentclick 事件中的任何点击之前,我会检查单元格的值是否不是只读的

  public static void DataGridViewCellVisibility(DataGridViewCell cell, bool visible)
  {
        cell.Style = visible ?
              new DataGridViewCellStyle { Padding = new Padding(0, 0, 0, 0) } :
              new DataGridViewCellStyle { Padding = new Padding(cell.OwningColumn.Width, 0, 0, 0) };

        cell.ReadOnly = !visible;
  }
于 2015-11-30T02:58:40.590 回答
2

作为对 Sriram 答案的改进,我建议只覆盖单元格绘制事件并仅绘制背景。我发现画一个文本框让它看起来有点奇怪。

void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) { if (e.ColumnIndex == yourColumnIndex && String.IsNullOrEmpty((string)e.FormattedValue)) { e.PaintBackground(e.ClipBounds, true); e.Handled = true; } }

于 2018-06-08T14:42:10.517 回答
2

填充对我不起作用。我认为将单元格设为空文本单元格更容易、更清晰。VB,但你明白了:

Dim oEmptyTextCell As New DataGridViewTextBoxCell()
oEmptyTextCell.Value = String.Empty
oRow.Cells(i) = oEmptyTextCell
于 2018-01-16T15:57:30.750 回答
1

处理自定义绘画并在那里绘制一个文本框。

void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.ColumnIndex == yourColumnIndex && String.IsNullOrEmpty((string)e.FormattedValue))
    {
        Graphics g = e.Graphics;
        TextBoxRenderer.DrawTextBox(g, e.CellBounds,
            System.Windows.Forms.VisualStyles.TextBoxState.Normal);
        e.Handled = true;
    }
}
于 2014-08-08T11:25:48.203 回答
1

您可以DataGridViewButton按照这篇文章中的建议稍加努力地禁用 a:禁用 datagridview 中的按钮列

我更喜欢使用DataGridViewImageColumnandDataGridView.CellFormatting事件来显示不同的图片,因为可以启用或不启用图像按钮。

在这种情况下,如果必须禁用按钮,您可以显示空白图像并且对DataGridView.CellClick事件不执行任何操作。

于 2014-08-08T10:02:34.717 回答
0

我只是将所有边填充到单元格的高度和宽度(以较大者为准。)

于 2018-10-18T14:12:55.860 回答
-1

对于更简单的解决方案,可以隐藏包含要隐藏的按钮的列。

例如:( GridView1.Columns[0].Visible = false;第一列)

只需从 0 开始计算要隐藏的列。

于 2018-01-18T11:49:59.457 回答