web-dev-qa-db-ja.com

プログラムでDataGridViewに新しい列を追加します

DataTableにバインドされたDataGridViewがあります。 DataTableは、データベースクエリから読み込まれます。テーブルには、BestBeforeという名前の列が含まれています。 BestBeforeは文字列としてフォーマットされた日付です(SQLiteには日付型がありません)。

Statusと呼ばれるDataGridViewに新しい列をプログラムで追加したいと思います。 BestBeforeが現在の日付よりも小さい場合、Status値はOKに設定する必要があります。それ以外の場合、Status値はNOT OKに設定する必要があります。

私はWinformsを初めて使用するので、いくつかのサンプルコードをいただければ幸いです。

更新:

DataColumn.Expressionは、列の整数値に別の値を掛けるなどの簡単な計算を行うのには問題ないと思いますが、私がする必要があることはどうでしょうか?つまり、現在とBestBefore列の日付(書式設定された文字列)の差を計算して、新しいステータス列に与える値を決定します。サンプルコードをいただければ幸いです。

38
halfpint

新しい列をDataTableに追加し、列Expressionプロパティを使用してステータス式を設定します。

ここに良い例があります: DataColumn.Expression Property

ADO.NETのDataTableおよびDataColumn式-計算列

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"));
19
HABJAN

複雑にしないでおく

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

行を追加するには

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

以下に、グリッドビューにプログラムで2つの列を追加するサンプルメソッドを示します。

    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という名前のビューに2つの列を作成し、Form1.Designer.csでColumn1を検索して、参照されているすべての場所を確認しました。次の情報は、私が収集し、コピーおよび変更して、さらに2つの列を動的に作成するものです。

// 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";
13
Paul Sasik