Как я могу создавать различные форматы ячеек в Winform DataGridView

У меня есть DataGridView, который я привязываю к DataTable.
DataTable - это все числовые значения.
Требуется, чтобы каждые n строк в DataGridView содержали текст, а не числовые значения (для визуального разделения разделов для пользователя).

Я счастлив поместить эти текстовые данные в DataTable или в DataGridView после привязки, но я не вижу способа поместить эти текстовые данные в любой из них, поскольку форматы столбцов для обоих требуют числовых данных - я получаю сообщение "не могу поместите строку в десятичной "ошибке" для обоих.

Есть идеи, как изменить формат определенной строки или ячейки в DataTable или DataGridView?

Ответов (3)

Решение

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

public partial class Form1 : Form
{
    DataGridViewCellStyle _myStyle = new DataGridViewCellStyle();

    public Form1()
    {
        InitializeComponent();

        _myStyle.BackColor = Color.Pink;
        // We could also provide a custom format string here 
        // with the _myStyle.Format property
    }

    private void dataGridView1_CellFormatting(object sender, 
        DataGridViewCellFormattingEventArgs e)
    {
        // Every five rows I want my custom format instead of the default
        if (e.RowIndex % 5 == 0)
        {
            e.CellStyle = _myStyle;
            e.FormattingApplied = true;
        }
    }

    //...
}

Для получения помощи по созданию собственных стилей обратитесь к соответствующему DataGridView.CellFormatting Event разделу онлайн-справки.

Я использовал Janus GridEx для такого нестандартного поведения. (Отчасти потому, что он делает гораздо больше, чем просто это, например группирование и суммирование, просмотр карточек и т. Д.) На веб-сайте есть несколько хороших демонстраций.

(Это не коммерческое предложение; у меня просто был хороший опыт использования их компонента.)

Скриншот сгруппированных и суммированных данных сетки
(источник: janusys.com )

Решает ли это вашу проблему?

// Set the data source.
dataGridView1.DataSource = dataTable1;

// Create a new text box column.
DataGridViewColumn c1 = new DataGridViewTextBoxColumn();
const string C1_COL_NAME = "Custom1";
c1.Name = C1_COL_NAME;

// Insert the new column where needed.
dataGridView1.Columns.Insert(1, c1);

// Text can then be placed in the rows of the new column.
dataGridView1.Rows[0].Cells[C1_COL_NAME].Value = "Some text...";

Привязки исходных таблиц данных должны по-прежнему существовать.