Иногда я хочу скрыть кнопки в 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.

Другие вопросы по тегам