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

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

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

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


person Handleman    schedule 26.02.2009    source источник


Ответы (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 интерактивной справки.

person Dave R.    schedule 02.03.2009

Это решает вашу проблему?

// 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...";

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

person DanLomas    schedule 27.02.2009

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

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

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

person JMD    schedule 26.02.2009
comment
Итак, вы не думаете, что мое требование может быть выполнено с помощью стандартного DataGridView? - person Handleman; 27.02.2009
comment
Ну, я не решаюсь сказать это, потому что здесь есть люди с большим опытом изменения поведения элементов управления WinForms, чем я. Я, честно говоря, удивлен, что никто больше не заговорил. - person JMD; 27.02.2009