C# 以编程方式向DataGridView添加新列

C# 以编程方式向DataGridView添加新列,c#,winforms,datagridview,C#,Winforms,Datagridview,我将DataGridView绑定到DataTable。DataTable是从数据库查询填充的。该表包含一个名为BestBefore的列。BestBefore是一个格式化为字符串的日期(SQLite没有日期类型) 我想以编程方式向DataGridView添加一个名为Status的新列。如果BestBefore小于当前日期,则状态值应设置为OK,否则状态值应设置为NOT OK 我对Winforms非常陌生,因此非常感谢您提供一些示例代码 更新: 我认为DataColumn.Expression可以进

我将DataGridView绑定到DataTable。DataTable是从数据库查询填充的。该表包含一个名为BestBefore的列。BestBefore是一个格式化为字符串的日期(SQLite没有日期类型)

我想以编程方式向DataGridView添加一个名为Status的新列。如果BestBefore小于当前日期,则状态值应设置为OK,否则状态值应设置为NOT OK

我对Winforms非常陌生,因此非常感谢您提供一些示例代码

更新:


我认为DataColumn.Expression可以进行简单的计算,比如将一列的整数值乘以另一个值,但我需要做什么呢?也就是说,计算BestBefore列中的“现在”和日期(字符串格式)之间的差值,以确定为新状态列指定的值。示例代码将不胜感激

将新列添加到
数据表
,并使用列
表达式
属性设置表达式的状态

在这里你可以找到一个很好的例子:

更新

代码示例:

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;
DataTable dt=newdatatable();
添加(新的数据列(“colBestBefore”,typeof(DateTime));
Add(新数据列(“colStatus”,typeof(string));
dt.Columns[“colStatus”].Expression=String.Format(“IIF(colBestBefore<#{0}},'Ok','notok')”,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"));
dt.Columns[“colStatus”].Expression=String.Format(“IIF(CONVERT(CONVERT(colBestBefore,'System.DateTime'),'Ok','notok')”,DateTime.Now.ToString(“yyyy-MM-dd-HH:MM:ss”);

下面是一个示例方法,它以编程方式将两个额外的列添加到网格视图中:

    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中搜索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";
保持简单

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

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

我不想只添加一列。我想基于另一列的值设置其值,该列具有日期值。添加该列后,在DataBindingComplete事件中执行以下操作:
foreach(dgv.Rows中的DataGridViewRow行){if(row.Cells[7].value.ToString()==“1”)row.Cells[0].value=“number one};
(仅举一个例子..)。但是请记住它必须在DataBindingComplete中,否则它将保持空白。我喜欢这个答案,因为它不需要定义额外的DataTable。这是解决这个问题最简洁明了的答案。如果我能投超过1票,我会的。回答得很好…+1太棒了!谢谢你教我钓鱼。这项技术将有助于了解许多有关winforms@JohnHenckeln/p这就是为什么如此。另外,感谢您的友好反馈!对于简单的表达式来说没关系,但是做我需要做的事情呢?也就是说,计算BestBefore列中的“现在”和日期(字符串格式)之间的差值,以确定为新状态列指定的值。示例代码将不胜感激。谢谢。@halfpint:我用您需要的工作示例更新了我的答案。我的BestBefore列是字符串格式的日期和时间,而不是日期时间类型。这还能起作用吗?谢谢您的反馈-非常感谢。@halfpint:是的,请看更新2。