Есть ли способ иметь WinForms DataGridView со столбцом, отображающим несколько значений из записи - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь отобразить 2 или 3 значения из записи в одной строке ячейки DataGridView.Ниже приведен класс, представляющий запись для привязки данных:

Class Book
{
  public int BookId {get;set;}
  public string Title {get;set;}
  public string Publisher {get;set}
  public string Author {get;set}
  public Date CopyrightDate {get;set}
  public byte[] BookCoverImage {get;set}
}

Я хотел бы иметь сетку, которая выглядит следующим образом:

enter image description here

Меня интересует только то, как создать второй столбец под названием Сводная информация.Мне было интересно, есть ли способ отображения информации в столбце «Сводка» из источника с привязкой к данным.Сейчас я отображаю информацию в каждом столбце, но хотел бы, чтобы в одной ячейке было несколько значений, как показано на рисунке.Если это можно сделать в WinForms DataGridView (или, может быть, есть другой элемент управления, который я должен использовать?), Может кто-нибудь предоставить информацию или ссылку на информацию о том, как это можно сделать?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Можно использовать любое из следующих решений:

  • Добавить сводное свойство только для чтения к классу и использовать связанный столбец.
  • Используйте событие CellFormatting, чтобы указать значение длянесвязанный столбец.
  • Использование события CellPainting для пользовательского отображения содержимого связанной или несвязанной ячейки.
  • Использование элемента управления DataRepeater.

Вариант 1 - Добавление сводного свойства

Вы можете добавить новое свойство Summary, содержащее информацию, которую вы хотите отобразить в ячейке:

Class Book
{
    // rest of properties ...
    public string Summary
    {
        get 
        {
            return
                $"Title: {this.Title}\n" +
                $"Author: {this.Author}\n" +
                $"Copyright Date: {this.CopyrightDate}";
        }
    }
}

Затем вы можете просто использовать связанный столбец для отображения данных в DataGridView.

Примечание 1: Если модель генерируется автоматически, вы можете поместить новое свойство в частичный класс.

Примечание 2: В случае использования DataTable вы можете просто создать столбец формулы, задав выражение для столбца.

Опция 2 - ЯчейкаФорматирование

Вы можете добавить несвязанный столбец и просто указать значение ячейки во время выполнения в CellFormatting дажеЭлемент управления DataGridView:

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    var dgv = (DataGridView)sender;
    if (e.RowIndex < 0 || e.RowIndex == dgv.NewRowIndex)
        return;
    if (e.ColumnIndex == 1 /*The column index which you want to format*/)
    {
        var book = dgv.Rows[e.RowIndex].DataBoundItem as Book;
        if (book != null)
            e.Value =
                $"Title: {book.Title}\n" +
                $"Author: {book.Author}\n" +
                $"Copyright Date: {book.CopyrightDate}";
    }
}

Вариант 3 - Использование события CellPaintig для пользовательской ячейки рисования

Вы можете увидеть пример содержимого ячейки рисованияс различными шрифтами в этом посте: Как создать нижний колонтитул для ячейки в DataGridView .

Вариант 4 - Использование DataRepeater Элемент управления

Вы можете использовать элемент управления DataRepeater.

Блоки питания Visual Basic DataRepeater можно прокручивать.Контейнер для элементов управления, которые отображают повторяющиеся данные, например, строки в таблице базы данных.Его можно использовать в качестве альтернативы элементу управления DataGridView, когда вам нужно больше контроля над макетом данных.DataRepeater «повторяет» группу связанных элементов управления, создавая несколько экземпляров в режиме прокрутки.Это позволяет пользователям просматривать несколько записей одновременно.

0 голосов
/ 05 июня 2018

предположим, что у вас есть dataGridView1, и вы хотите отобразить данные, как показано на изображении вопроса.Вы можете сделать что-то, как показано ниже.

здесь мы использовали "\ n", чтобы добавить новые строки в значение ячейки, а DefaultCellStyle.WrapMode позаботится о правильном размещении данных в новой строке.

youпотребуется установить столбцы с изменяемым размером в соответствии с содержимым.

List<Book> bookList = new List<Book>();
for(int i = 0; i < 3; i++)
{
    //for simplicity of solution, i have used cover as string not image,
    // you can perform same logic with cover as image too.
    bookList.Add(new Book(i, "title" + i, "publisher" + i, "auther" + i, "cover" + i));
}

DataTable dt = new DataTable();
dt.Columns.Add("ColBook");
dt.Columns.Add("ColData");

foreach(Book book in bookList)
{
    DataRow dr = dt.NewRow();
    dr["ColBook"] = book.BookCoverImage;
    dr["ColData"] = "Title:"+book.Title + "\nPublisher:" + book.Publisher + "\nAuthor:" + book.Author;
    dt.Rows.Add(dr);
}

dataGridView1.DataSource = dt;
dataGridView1.Columns[1].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
...