Иногда я хочу скрыть кнопки в DataGridViewButtonColumn
У меня есть DataGridView
который был предметом предыдущего вопроса ( ссылка). Но иногда Баттон 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;
}
}
}
8 ответов
У меня была такая же "проблема" сегодня. Я также хотел скрыть кнопки определенных строк. Поработав с ним некоторое время, я обнаружил очень простое и приятное решение, которое не требует перегрузки. paint()
-функции или аналогичные вещи:
Просто назначьте другой 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.
Поставь кнопку вправо и готово
DataGridViewCellStyle dataGridViewCellStyle2 = new DataGridViewCellStyle();
dataGridViewCellStyle2.Padding = new Padding(0, 0, 1000, 0);
row.Cells["name"].Style = dataGridViewCellStyle2;
Основываясь на ответе Тобиаса, я создал небольшой статический вспомогательный метод, чтобы скрыть содержимое ячейки путем корректировки ее заполнения.
Имейте в виду, что кнопка по-прежнему "кликабельна" в том смысле, что если пользователь выбирает ячейку и нажимает пробел, он нажимает скрытую кнопку, поэтому я проверяю, что значение ячейки не доступно только для чтения, прежде чем обрабатывать какие-либо щелчки в моем событии 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;
}
В качестве улучшения ответа Шрирама я бы предложил просто переопределить событие рисования ячеек и рисовать только фон. Я обнаружил, что рисование текстового поля сделало его немного странным.
void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.ColumnIndex == yourColumnIndex && String.IsNullOrEmpty((string)e.FormattedValue))
{
e.PaintBackground(e.ClipBounds, true);
e.Handled = true;
}
}
Паддинг не работает для меня. Я думаю, что легче и чище просто сделать ячейку пустой текстовой ячейкой. В.Б., но вы поняли:
Dim oEmptyTextCell As New DataGridViewTextBoxCell()
oEmptyTextCell.Value = String.Empty
oRow.Cells(i) = oEmptyTextCell
Вы можете отключить DataGridViewButton
с небольшим усилием, как предлагается в этом посте: Отключение столбца кнопки в представлении данных
Я предпочел использовать DataGridViewImageColumn
а также DataGridView.CellFormatting
событие для отображения различных изображений, как кнопка изображения может быть включена или нет.
В этом случае, если кнопка должна быть отключена, вы можете отобразить пустое изображение и ничего не делать на DataGridView.CellClick
событие.
Обрабатывайте пользовательские рисунки и раскрашивайте там текстовые поля.
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;
}
}
Я просто помещаю отступы со всех сторон на высоту и ширину ячейки (в зависимости от того, что больше).
Для более простого решения можно скрыть столбец, содержащий кнопку, которую вы хотите скрыть.
Например:GridView1.Columns[0].Visible = false;
(Первый столбец)
Просто посчитайте, какой столбец вы хотите скрыть, начиная с 0.