トップ回答者
LINQ to SQL で DataGridView に表示したデータの一部を変更したい

質問
-
お世話になります。
初心者であり、表現が正しくない部分もあるかと思いますが、よろしくお願いいたします。
表題がうまく付けられていませんが、内容は以下のようになります。
・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
回答
-
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!)
すべての返信
-
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!)
-