DOBON.NETプログラミング道掲示板

■34164 / 親記事)  Visual Studio DataTableの値のアクセスの仕方
  
□投稿者/ メンバー 一般人(1回)-(2019/02/26(Tue) 17:39:27)
  • アイコン環境/言語:[c#] 
    分類:[.NET] 

    Visual Studio2015のウォッチウィンドウでDataTableの値を探しています。
    
    DataSet ds = new DataSet();
    DataTable dt = new DataTable();
    
    // 5列定義します。
    dt.Columns.Add("A");
    dt.Columns.Add("B");
    dt.Columns.Add("C");
    dt.Columns.Add("D");
    dt.Columns.Add("E");
    
    // 4行追加します。
    for (int i = 0; i < 4; i++)
    {
        DataRow row = dt.NewRow();
        row["A"] = i;
        dt.Rows.Add(row);
    }
    
    // DataSetにdtを追加します。
    ds.Tables.Add(dt);
    
    dt.TableName = "Table1";
    
    Console.WriteLine(ds.Tables["Table1"].Rows[0]["A"].ToString());
    Console.WriteLine(ds.Tables["Table1"].Rows[1][0].ToString());
    Console.WriteLine(ds.Tables["Table1"].Rows[2].ItemArray[0].ToString());
    DataRow row2 = ds.Tables["Table1"].Rows[3];
    Console.WriteLine(row2["A"].ToString());
    
    Rowsオブジェクトの中をみてもRowsオブジェクト直下にItemArrayも表示されていません。
    わからないのが、なぜRows[0]["A"]、Rows[1][0]、Rows[2].ItemArray[0]で値にアクセスできるんでしょうか?
    
    

マルチポストを報告
違反を報告
引用返信 削除キー/
■34165 / ResNo.1)  Re[1]: Visual Studio DataTableの値のアクセスの仕方
□投稿者/ 魔界の仮面弁士 大御所(1205回)-(2019/02/26(Tue) 18:21:20)
  • アイコン2019/02/26(Tue) 22:10:07 編集(投稿者)

    No34164に返信(メンバーさんの記事)
    > 環境/言語:[c#] 

    誤: c#
    正: C#


    細かいことですが、日本工業規格 JIS X 3015 において、
    『C#は,LATIN CAPITAL LETTER C (U+0043)の次に NUMBER SIGN # (U+0023)を書く。』
    と明記されていますので、一応指摘まで。



    > Visual Studio2015のウォッチウィンドウでDataTableの値を探しています。

    ウォッチウィンドウやローカルウィンドウで、
    変数 ds や dt を表示させているという意味でしょうか。

    一時停止中に、ウォッチウィンドウの 虫眼鏡 アイコンをクリックすれば、
    DataTable の内容をグリッド表示できますね。


    > Rowsオブジェクトの中をみてもRowsオブジェクト直下にItemArrayも表示されていません。

    Rows プロパティが返すオブジェクトは、「DataRow クラス」のインスタンスではなく、
    DataRow のコレクションにあたる「DataRowCollection クラス」のインスタンスだからです。


    DataTableCollection tables = ds.Tables;
    DataTable table1 = tables["Table1"];
    DataRowCollection rows = table1.Rows;
    DataRow row0 = rows[0];
    object[] items = row0.ItemArray;
    dynamic data1 = row0["A"];
    dynamic data2 = items[0];



    > Console.WriteLine(ds.Tables["Table1"].Rows[0]["A"].ToString());

    折角 DataTable 型の変数 dt を保持しているのですから、
     Console.WriteLine(dt.Rows[0]["A"]);
    のようにした方が短く書けますよ。



    > DataSet ds = new DataSet();
    > DataTable dt = new DataTable();
    > dt.Columns.Add("A");
    >   :
    > ds.Tables.Add(dt);
    > dt.TableName = "Table1";

    上記の処理は、
     DataSet ds = new DataSet();
     DataTable dt = ds.Tables.Add("Table1");
     dt.Columns.Add("A");
       :
    のように短く書けます。


    このとき、「dt.Columns.Add("A");」という処理は
    string 型の列を追加することを意味しています。

    ※「dt.Columns.Add("A", typeof(string));」と同義。

    ですから、
    > row["A"] = i;
    のように、int 型の値を代入するのではなく、
     row["A"] = i.ToString();
    のように、string 型の値を代入することが望ましいです。

    もしも int 値を保存するための列なのであれば、
     dt.Columns.Add("A", typeof(int));
    としておきましょう。


    > // 4行追加します。
    追加し終わったら
     ds.AccesptChanges();
    を呼んでおくと良いでしょう。

    データテーブルの各行は、
     「追加された行」「未編集の行」
     「編集済み行」「削除された行」
    といった状態を管理しているものだからです。


    // 「追加された行」を確定して「未編集の行」にする
    dt.AcceptChanges();

    // 値が 1 から "100" へと編集された
    dt.Rows[0]["A"] = "100";

    // 現在の値 "100" を出力
    Console.WriteLine(dt.Rows[0]["A"]);

    // 変更前の値 1 が出力される
    Console.WriteLine(dt.Rows[0]["A", DataRowVersion.Original]);
違反を報告
引用返信 削除キー/
■34199 / ResNo.2)  Re[1]: Visual Studio DataTableの値のアクセスの仕方
□投稿者/ shu 大御所(485回)-(2019/03/30(Sat) 07:21:18)
  • アイコンNo34164に返信(メンバーさんの記事)
    >
    > Rowsオブジェクトの中をみてもRowsオブジェクト直下にItemArrayも表示されていません。
    > わからないのが、なぜRows[0]["A"]、Rows[1][0]、Rows[2].ItemArray[0]で値にアクセスできるんでしょうか?
    >
    RowsはDataRowの集まりであるのでRowsがItemArrayを持っているわけではありません。
    Rows[0]とするとDataTableの1行目のDataRowを表すのでこのように値を取得することが出来ます。
    Rows[0]["A"]
    と考えるのではなく
    DataRow row = rows[0];
    ・・・ row["A"] ・・・;
    と考えれば分かりやすいかと思います。



違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -