Программно добавить новый столбец в DataGridView
У меня есть DataGridView, связанный с DataTable. DataTable заполняется из запроса базы данных. Таблица содержит столбец с именем BestBefore. BestBefore - это дата, отформатированная как строка (у SQLite нет типов дат).
Я хотел бы программно добавить новый столбец в DataGridView с именем Status. Если значение BestBefore меньше текущей даты, значение состояния должно быть установлено на OK, иначе значение статуса должно быть установлено как NOT OK.
Я очень новичок в Winforms, поэтому некоторый пример кода был бы очень благодарен.
UPDATE:
Я думаю, что DataColumn.Expression подходит для простых вычислений, таких как умножение значения целочисленного столбца на другое значение, но как насчет того, что мне нужно делать? То есть, вычислите разницу между датой и датой (форматирование строки) в столбце BestBefore, чтобы определить, какое значение будет присвоено новому столбцу статуса. Пример кода будет оценен.
Ответы
Ответ 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";