Agregue una nueva columna mediante progtwigción a DataGridView

Tengo un DataGridView vinculado a una DataTable. DataTable se rellena desde una consulta de base de datos. La tabla contiene una columna llamada BestBefore. BestBefore es una fecha formateada como una cadena (SQLite no tiene tipos de fecha).

Me gustaría agregar programáticamente una nueva columna al DataGridView llamado Status. Si BestBefore es menor que la fecha actual, el valor de estado debe establecerse en OK; de lo contrario, el valor de estado debería establecerse en NO OK.

Soy muy nuevo en Winforms, por lo que un código de ejemplo sería muy apreciado.

ACTUALIZAR:

Creo que DataColumn.Expression está bien para hacer cálculos simples, como multiplicar el valor entero de una columna por otro valor, pero ¿qué hay de hacer lo que tengo que hacer? Es decir, calcule la diferencia entre ahora y la fecha (cadena formateada) en la columna BestBefore para determinar qué valor otorgar a la nueva columna de estado. El código de ejemplo sería apreciado.

Agregue una nueva columna a DataTable y use Expression propiedad Expression columna para establecer su expresión de estado.

Aquí puede encontrar un buen ejemplo: DataColumn.Expression Property

DataTable y DataColumn Expressions en ADO.NET – Columnas calculadas

ACTUALIZAR

Muestra de código:

 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; 

ACTUALIZACIÓN # 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")); 

Mantenlo simple

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

Para agregar filas

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

Aquí hay un método de muestra que agrega dos columnas adicionales programáticamente a la vista de cuadrícula:

  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. // Eg 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}); } 

Una excelente forma de descubrir cómo hacer este tipo de proceso es crear un formulario, agregar un control de vista de cuadrícula y agregar algunas columnas. (Este proceso funcionará para CUALQUIER tipo de control de formulario. Todas las instancias e inicializaciones ocurren en Designer). Luego examine el archivo Designer.cs del formulario para ver cómo se lleva a cabo la construcción. (Visual Studio hace todo de forma programática pero lo oculta en el Diseñador de formularios).

Para este ejemplo, creé dos columnas para la vista llamada Column1 y Column2 y luego busqué Form1.Designer.cs para Column1 para ver en todas partes a las que se hizo referencia. La siguiente información es lo que obtuve y copié y modifiqué para crear dos columnas más dinámicamente:

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