none
LINQ to SQL で DataGridView に表示したデータの一部を変更したい RRS feed

  • 質問

  • お世話になります。

    初心者であり、表現が正しくない部分もあるかと思いますが、よろしくお願いいたします。

    表題がうまく付けられていませんが、内容は以下のようになります。

     

    ・DBテーブル(担当者)があり、そのフィールドは TNO, TNAME とします。

     (データは、TNO: 1、2、・・・、10,  TNAME: 担当1、担当2、・・・、担当10)

    ・LINQ to SQLクラス (DataContext)は dc とします。

    ・フォームにDataGridView(Name:dgv)があります。

    ※ DBへの保存はユーザが登録・修正・削除を好きなだけ繰り返した後でまとめて行いたいため、SubmitChanges() は毎回呼びません。

     

    var q = dc.担当者
      .Select(x => new {
        TNO = x.TNO,
        TNAME = x.TNAME + "さん"
      });

    dgv.DataSource = q;

     

    1 | 担当1さん

    2 | 担当2さん

    :  :

    のように表示されます。次になにかのイベントにて

    dc.担当者.Single(x => x.TNO == 1).TNAME = "tanto1";

    としても、DataGridViewの表示が

     

    1 | 担当1さん ← tanto1さんと表示したい

    2 | 担当2さん

    :  :

    となってしまいます。(変化なし)

     

    var q = dc.担当者;

    dgv.DataSource = q;

    として、イベントにて同様に、

    dc.担当者.Single(x => x.TNO == 1).TNAME = "tanto1";

    とした場合には、このようになります。("さん"は無しになりますが・・)

    1 | tanto1

    2 | 担当2

    :  :

     

    変更した部分が反映されて表示でき、前述では "さん" を付けたかったため、newして、いるのが問題かと思っておりますが、"さん"を付けて表示する解決策をご教授頂けますでしょうか。

    また、今回は"さん"を付けるということで、select newしていますが、それ以外にも、フィールド名を変えたいという理由もあり、select newしています。(TNAME --> nameなど)

    よろしくお願いいたします。

    • 編集済み kentahoga 2013年2月16日 10:35
    2013年2月16日 10:06

回答

  • var q = dc.担当者;で得られるのは担当者クラスの一覧ですが、new{...}すると全く別のクラスにコピーされたものの一覧がDataGridViewのDataSourceにセットされます。
    ですから、元の担当者クラスの値を変更しても、別クラスの値には反映されません。同様に、別クラスを変更をしても元の担当者クラスには反映されません。

    元のTNAMEの文字列に"さん"をつけてDataGridViewに表示したい。
    new{...}している理由としてフィールド名の変更を上げていますが、これはDataGridViewの列名の表示を変えたいということですよね?

    であれば、DataGridViewで表示上だけ変更すればいいです。

    public Form1()
    {
        InitializeComponent();
    
        dgv.CellFormatting += new DataGridViewCellFormattingEventHandler(dgv_CellFormatting);
    
        var q = dc.担当者;
        dgv.DataSource = q;
        dgv.Columns["TNAME"].HeaderText = "たんとーしゃめー";
    }
    
    void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        DataGridView dgv = (DataGridView)sender;
        if (e.Value ==null ||( dgv.DataSource == null && dgv.Columns.Count>e.ColumnIndex ))
        {
            return;
        }
        DataGridViewCell cell = dgv[e.ColumnIndex, e.RowIndex];
        if (cell.IsInEditMode) //編集中はさん付けしない
        {
            return;
        }
        if (dgv.Columns[e.ColumnIndex].Name == "TNAME")
        {
            e.Value = e.Value.ToString() + "さん";
            e.FormattingApplied = true;
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 佐伯玲 2013年2月18日 0:11
    • 回答の候補の設定解除 kentahoga 2013年2月18日 0:32
    • 回答としてマーク kentahoga 2013年2月18日 1:06
    2013年2月17日 1:10

すべての返信

  • var q = dc.担当者;で得られるのは担当者クラスの一覧ですが、new{...}すると全く別のクラスにコピーされたものの一覧がDataGridViewのDataSourceにセットされます。
    ですから、元の担当者クラスの値を変更しても、別クラスの値には反映されません。同様に、別クラスを変更をしても元の担当者クラスには反映されません。

    元のTNAMEの文字列に"さん"をつけてDataGridViewに表示したい。
    new{...}している理由としてフィールド名の変更を上げていますが、これはDataGridViewの列名の表示を変えたいということですよね?

    であれば、DataGridViewで表示上だけ変更すればいいです。

    public Form1()
    {
        InitializeComponent();
    
        dgv.CellFormatting += new DataGridViewCellFormattingEventHandler(dgv_CellFormatting);
    
        var q = dc.担当者;
        dgv.DataSource = q;
        dgv.Columns["TNAME"].HeaderText = "たんとーしゃめー";
    }
    
    void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        DataGridView dgv = (DataGridView)sender;
        if (e.Value ==null ||( dgv.DataSource == null && dgv.Columns.Count>e.ColumnIndex ))
        {
            return;
        }
        DataGridViewCell cell = dgv[e.ColumnIndex, e.RowIndex];
        if (cell.IsInEditMode) //編集中はさん付けしない
        {
            return;
        }
        if (dgv.Columns[e.ColumnIndex].Name == "TNAME")
        {
            e.Value = e.Value.ToString() + "さん";
            e.FormattingApplied = true;
        }
    }


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 佐伯玲 2013年2月18日 0:11
    • 回答の候補の設定解除 kentahoga 2013年2月18日 0:32
    • 回答としてマーク kentahoga 2013年2月18日 1:06
    2013年2月17日 1:10
  • gekka様 ご返信ありがとうございます。

    ご説明していただきましたnew{...}の意味合いが理解できて来ました。

    また、"さん"をつけるソース例を記載していただき、ありがとうございます。知らなかった方法でしたので、大変勉強になります。

    フィールド名に関しては、少し意味合いが違っていたのですが、私のDataGridViewに対する理解不足で勘違いをしておりました。

    よって、問題が解決しましたので、gekka様の投稿を回答としてマークさせて頂きます。

    ありがとうございました。


    • 編集済み kentahoga 2013年2月18日 1:07
    2013年2月18日 0:12