Как добавить кнопки для некоторых (не всех) столбцов в моем DataGridView? - PullRequest
4 голосов
/ 24 ноября 2010

Я пытаюсь обновить этот объект DataGridView таким образом, чтобы при значении == "bob" в столбце рядом с его именем была бы кнопка, в противном случае я не хочу, чтобы какая-либо кнопка появлялась.

DataGridViewTextBoxColumn valueColumn = new DataGridViewTextBoxColumn();
DataGridViewButtonColumn buttonColumn = new DataGridViewButtonColumn();

buttonColumn.ReadOnly = true;
buttonColumn.Visible = false;

this.dgv.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
valueColumn,
buttonColumn,
});

//elsewhere...

if(value == "bob")
{
    Button button = new Button()
    {
        Text = "null",
    };

    index = dgv.Rows.Add(value, button);
    DataGridViewButtonCell buttonCell = dgv.Rows[index].Cells[2] as DataGridViewButtonCell;
    buttonCell.Visible = true;
}
else
{
    dgv.Rows.Add(value);
}

Но, поскольку я не могу установить Visible для ячейки, это не работает. Есть ли способ добавить кнопку, чтобы только строки были Value == "bob"?

Ответы [ 3 ]

4 голосов
/ 21 ноября 2013

Вот небольшой аккуратный хак, который я использовал раньше для достижения этой цели:

Вместо использования DataGridViewButtonColumn используйте DataGridViewTextBoxColumn и при необходимости добавьте DataGridViewButtonCell.

, например

    private void button1_Click(object sender, EventArgs e)
    {
        // Iterate through each of the rows.
        for (int i = 0; i < dgv.RowCount - 1; i++)
        {
            if (dgv.Rows[i].Cells[0].Value.ToString() == "bob")
            {
                // Here is the trick.
                var btnCell = new DataGridViewButtonCell();
                dgv.Rows[i].Cells[1] = btnCell;
            }
        }
    }

В приведенном выше примере у меня есть два DataGridViewTextBoxColumns и итерация по каждой строке в событии нажатия кнопки. Я проверяю первый столбец, чтобы увидеть, содержит ли он «bob», и если он есть, я добавляю кнопку в столбце рядом с ним. Вы можете использовать этот трюк по своему усмотрению (например, нажатие кнопки, событие RowsAdded, событие CellEndEdit и т. Д.). Эксперимент по-разному. Надеюсь, это кому-нибудь поможет!

3 голосов
/ 24 ноября 2010

Здесь есть две возможности, одна уродливая и одна из MSDN.

Уродливая: Добавить кнопку к вашему DGV во время выполнения

Выполните следующие действия:
- добавьте несвязанный DataGridViewTextBoxColumn к вашему DGV.Обратите внимание, что это значение индекса в вашем DGV;это то место, куда вы положите свою кнопку.
- Используйте событие CellFormatting вашего DGV, например, так:

    private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {
        if (e.ColumnIndex == 0) {  // Assumes column 0 has the data that determines if a button should be displayed.
            if (e.Value.ToString() == "bob") {  // Test if a button should be displayed on row.
                // Create a Button and add it to our DGV.
                Button cellButton = new Button();
                // Do something to identify which row's button was clicked.  Here I'm just storing the row index.
                cellButton.Tag = e.RowIndex;
                cellButton.Text = "Hello bob";
                cellButton.Click += new EventHandler(cellButton_Click);
                dataGridView1.Controls.Add(cellButton);
                // Your ugly button column is shown here as having an index value of 3.
                Rectangle cell = this.dataGridView1.GetCellDisplayRectangle(3, e.RowIndex, true);
                cellButton.Location = cell.Location;
            }
        }
    }

Когда пользователь нажимает кнопку, событие cellButton_Click будет срабатывать.Вот некоторый тестовый код:

    void cellButton_Click(object sender, EventArgs e) {
        Console.WriteLine("Hello from row: {0}", ((Button) sender).Tag);
    }

Как видите, он не очень изыскан.Я основал это на еще более уродливом образце, который нашел.Я уверен, что вы можете изменить его в соответствии со своими потребностями.

Из MSDN: Свернуть свой собственный (расширить) DataGridViewButtonColumn, который условно отображает отключенную кнопку.

Для этогосм. Как: отключить кнопки в столбце кнопок в элементе управления Windows Forms DataGridView

Конечно, на самом деле эта опция не удаляет каких-либо кнопок, только условно отключает им.Однако для вашего приложения это может быть лучше.

1 голос
/ 12 сентября 2014

Вы можете выполнить рисование ячейки на событии рисования ячейки:

private void dgv_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
     if(e.RowIndex>=0 && e.ColumnIndex == indexOfButtonColumn  && value[e.RowIndex] != "bob")
     {
           e.Paint(e.ClipBounds, DataGridViewPaintParts.All & ~DataGridViewPaintParts.ContentForeground & ~DataGridViewPaintParts.ContentBackground); 
           e.Handled = true;      
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...