Подтвердить что ты не робот

Программно добавить новый столбец в DataGridView

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

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

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

UPDATE:

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

4b9b3361

Ответ 1

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

Здесь вы можете найти хороший пример: 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"));

Ответ 2

Держите его простым

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

Чтобы добавить строки

dataGridView1.Rows.Add("Value for column#1"); // [,"column 2",...]

Ответ 3

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

    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.cs, чтобы узнать, как происходит строительство. (Visual Studio делает все программно, но скрывает его в конструкторе форм.)

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

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