Программно добавить новый столбец в DataGridView - PullRequest
37 голосов
/ 02 апреля 2011

У меня есть DataGridView, связанный с DataTable.DataTable заполняется из запроса к базе данных.Таблица содержит столбец с именем BestBefore.BestBefore - это дата, отформатированная как строка (SQLite не имеет типов даты).

Я хотел бы программно добавить новый столбец в DataGridView с именем Status.Если значение BestBefore меньше текущей даты, значение статуса должно быть установлено на OK, в противном случае значение статуса должно быть установлено на NOT OK.

Я очень новичок в Winforms, поэтому некоторые примеры кода будут с благодарностью.

ОБНОВЛЕНИЕ:

Я думаю, что DataColumn.Expression подходит для простых вычислений, таких как умножение целочисленного значения столбца на другое значение, но как насчет того, что мне нужно сделать??То есть, вычислите разницу между текущим временем и датой (в формате строки) в столбце BestBefore, чтобы определить, какое значение будет давать новый столбец состояния.Пример кода будет оценен.

Ответы [ 3 ]

35 голосов
/ 08 января 2015

Не усложняйте

dataGridView1.Columns.Add("newColumnName", "Column Name in Text");

Для добавления строк

dataGridView1.Rows.Add("Value for column#1"); // [,"column 2",...]
19 голосов
/ 02 апреля 2011

Добавьте новый столбец к DataTable и используйте свойство column Expression для установки выражения состояния.

Здесь вы можете найти хороший пример: DataColumn.Expression Недвижимость

выражения DataTable и DataColumn в ADO.NET - вычисляемые столбцы

UPDATE

Пример кода:

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("colBestBefore", typeof(DateTime)));
dt.Columns.Add(new DataColumn("colStatus", typeof(string)));

dt.Columns["colStatus"].Expression = String.Format("IIF(colBestBefore < #{0}#, 'Ok','Not ok')", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

dt.Rows.Add(DateTime.Now.AddDays(-1));
dt.Rows.Add(DateTime.Now.AddDays(1));
dt.Rows.Add(DateTime.Now.AddDays(2));
dt.Rows.Add(DateTime.Now.AddDays(-2));

demoGridView.DataSource = dt;

ОБНОВЛЕНИЕ № 2

dt.Columns["colStatus"].Expression = String.Format("IIF(CONVERT(colBestBefore, 'System.DateTime') < #{0}#, 'Ok','Not ok')", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
13 голосов
/ 02 апреля 2011

Вот пример метода, который программно добавляет два дополнительных столбца в представление сетки:

    private void AddColumnsProgrammatically()
    {
        // I created these columns at function scope but if you want to access 
        // easily from other parts of your class, just move them to class scope.
        // E.g. Declare them outside of the function...
        var col3 = new DataGridViewTextBoxColumn();
        var col4 = new DataGridViewCheckBoxColumn();

        col3.HeaderText = "Column3";
        col3.Name = "Column3";

        col4.HeaderText = "Column4";
        col4.Name = "Column4";

        dataGridView1.Columns.AddRange(new DataGridViewColumn[] {col3,col4});
    }

Отличный способ выяснить, как выполнить этот вид процесса, - создать форму, добавить представление сетки.контролировать и добавить несколько столбцов.(Этот процесс на самом деле будет работать для ЛЮБОГО вида управления формой. Вся реализация и инициализация происходит в Designer.) Затем проверьте файл Designer.cs формы, чтобы увидеть, как происходит построение.(Visual Studio делает все программно, но скрывает это в конструкторе форм.)

Для этого примера я создал два столбца для представления с именами Column1 и Column2, а затем искал в Form1.Designer.cs для Column1, чтобы увидеть везде, где это былоссылки.Следующая информация - это то, что я почерпнул и скопировал и изменил для динамического создания еще двух столбцов:

// Note that this info scattered throughout the designer but can easily collected.

        System.Windows.Forms.DataGridViewTextBoxColumn Column1;
        System.Windows.Forms.DataGridViewCheckBoxColumn Column2;

        this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
        this.Column2 = new System.Windows.Forms.DataGridViewCheckBoxColumn();

        this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
        this.Column1,
        this.Column2});

        this.Column1.HeaderText = "Column1";
        this.Column1.Name = "Column1";

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