Как нарисовать пользовательский DataGridViewCell - PullRequest
2 голосов
/ 15 мая 2009

Я пытаюсь вручную нарисовать ячейки в DataGridView. В частности, я хотел бы нарисовать ряд CheckBoxes. Обычно вы можете добавить DataGridViewCheckBoxColumn, но, насколько мне известно, DataGridViewCheckBoxRow не существует. (Я не могу просто создать много DGVCheckBoxColumns, потому что мне нужны разные типы ячеек в разных строках).

Я переопределил метод OnCellPainting () DGV. Я создал DGVCheckBoxCell:

protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
{
   DataGridViewCheckBoxCell cbcell = new DataGridViewCheckBoxCell();
}

Я не уверен, что делать дальше.


Подробнее:

В конечном итоге я пытаюсь перенести сетку данных. Поэтому у меня может быть CheckBoxColumn, ComboBoxColumn, TextBoxColumn и любой другой тип столбца, а затем превратить их в строки. Я не думаю, что смогу сделать DGVRows, поэтому я думаю, что мне придется иметь дело с индивидуальными клетками.

Спасибо за ответы на все вопросы ...

Ответы [ 3 ]

4 голосов
/ 15 мая 2009

Единственное, о чем я могу думать, это нарисовать флажок самостоятельно, что можно сделать, но это PIA. Потому что, как только вы это сделаете, вам придется управлять всей картиной для зависания / проверки / снятия галочки и т. Д. Однако, вот некоторый код для начала:

void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    e.Paint(e.ClipBounds, DataGridViewPaintParts.All);
    if (e.RowIndex == 2) //I chose a random number, but this is the row you want with checkboxes
    {
        var rect = this.dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
        //The CheckBoxState enum has all different values for different "visual states"
        CheckBoxRenderer.DrawCheckBox(e.Graphics, new Point(rect.X, rect.Y), System.Windows.Forms.VisualStyles.CheckBoxState.CheckedNormal);
        e.Handled = true;
    }
}

Удачи !!

1 голос
/ 15 мая 2009

Насколько я вижу, у вас есть два варианта:

  1. Создайте специальный тип ячейки, полученный из DataGridViewCell, который ведет себя по-разному в зависимости от содержимого этой ячейки. Затем вы можете установить этот тип ячейки в качестве CellTemplate каждого столбца, и DataGridView автоматически создаст его экземпляры для использования. Больно, но относительно легко понять и не слишком сложно сделать - просто утомительно.

  2. Аналогично # 1, но вместо создания дурацкого типа Cell создайте специальный CellTemplate и переопределите его метод Clone. Сделайте так, чтобы метод Clone автоматически определял правильный тип ячейки для конструирования и возвращал ее, а не возвращал необработанный клон шаблона. Это ужасный взлом, и я не рекомендую его, если вы не можете получить первый подход к работе.

Для успешного использования второго подхода потребуется знание строки, которая в настоящее время создается (если вы посмотрите на DataGridViewRow.CreateCells в Reflector, вы можете получить представление о том, как он работает). Знание того, какой тип построить, потребует знания текущей строки, и я не уверен на 100%, что вы можете это получить. Но я подозреваю, что это возможно, если вы захотите попробовать и покопаться.

0 голосов
/ 15 мая 2009

Здесь кто-то спросил то же самое: vbforums.com

"Вам необходимо создать новые объекты DataGridViewTextBoxCell и назначить их элементам коллекции Cells строки."

Я еще не понял, как это сделать.
В этом посте автор пишет, что это возможно.

Ваш сценарий связан с данными?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...