VisualStudio2005Pro(C#)とSQLServer2005で開発しています。バインド状態にあるDataGridView内で数量フィールド×金額フィールドの値を合計フィールドに表示し、更にデータベースの各フィールドへ結果を格納したいと思っています。これを実現するにはどうしたらいいでしょうか?ネット検索した結果、DataColumn.Expressionプロパティを使うまでは解ったんですがバインド状態にあるDataGridViewではどのようにしたらいいのかわかりません。サンプルや解りやすい解説をしたサイトなどあれば教えてください。

回答の条件
  • 1人2回まで
  • 登録:2007/09/13 13:46:42
  • 終了:2007/09/20 13:07:13

回答(2件)

id:freemann No.1

freemann回答回数307ベストアンサー獲得回数492007/09/13 16:47:11

ポイント35pt

以下にNorthwindを使ったサンプルのコードを載せます。

private void Form2_Load(object sender, EventArgs e)

{

string strConn, strSQL;

SqlConnectionStringBuilder bldr = new SqlConnectionStringBuilder();

bldr.DataSource = "PC名";

bldr.InitialCatalog = "Northwind";

bldr.IntegratedSecurity = true;

strConn = bldr.ConnectionString;

strSQL = "SELECT OrderID,ProductID,UnitPrice,Quantity,Discount FROM [Order Details]";

ds = new DataSet();

da = new SqlDataAdapter(strSQL, strConn);

DataTable dt = ds.Tables.Add("Order Details");

dt.Columns.Add("OrderID", typeof(int));

dt.Columns.Add("ProductID", typeof(int));

dt.Columns.Add("UnitPrice", typeof(decimal));

dt.Columns.Add("Quantity", typeof(int));

dt.Columns.Add("Discount", typeof(double));

dt.Columns.Add("TotalPrice", typeof(int), "UnitPrice * Quantity"); //コンストラスでExpressionを指定している。

SqlCommandBuilder cb = new SqlCommandBuilder(da);

da.Fill(ds, "Order Details");

dataGridView1.DataSource = ds.Tables[0];

}

private void button1_Click(object sender, EventArgs e)

{

da.Update(ds, "Order Details");

}

id:artsnet111

バインドした状態のDGVでの書き方を知りたいのです。

private void order_DetailsBindingNavigatorSaveItem_Click(object sender, EventArgs e)

{

this.Validate();

this.order_DetailsBindingSource.EndEdit();

this.order_DetailsTableAdapter.Update(this.nORTHWNDDataSet.Order_Details);

}

private void Form1_Load(object sender, EventArgs e)

{

// TODO: このコード行はデータを 'nORTHWNDDataSet.Order_Details' テーブルに読み込みます。必要に応じて移動、または削除をしてください。

this.order_DetailsTableAdapter.Fill(this.nORTHWNDDataSet.Order_Details);

}

private void button1_Click(object sender, EventArgs e)

{

this.order_DetailsTableAdapter.Update(this.nORTHWNDDataSet.Order_Details);

}

この中に書くにはどうしたらいいですか?

2007/09/13 18:45:32
id:freemann No.2

freemann回答回数307ベストアンサー獲得回数492007/09/14 07:20:03

ポイント35pt

Expressionを使ったやり方ではないのですが、一応以下の手順でやればできるようです。

1)OrderDetailsDataSet.xsdを開きます。すると、ダイアログがあると思うのですが、その中のOrder DetailsTableAdapterのFill,GetData()の項目で右クリックで構成を選びます。

2)SELECT文が表示されるので、そこに UnitPrice * Quantity AS TotalPriceを追加。そうしたら、完了ボタンを押す。

3)フォームデザイナに戻ってDataGridViewを選択し、Columnsプロパティを開く。

4)追加ボタンを押すと新しいダイアログが出るので、上のデータバインド列にチェックを入れて、DataSourceの列でTotalPriceを選択する。そして追加ボタン。

以上で動くと思うのですが、注意点が一つ。

SQL文の結果からTotalPriceを取得しているため、UnitPriceやQuantityを変更した場合、保存ボタンを押してDBを更新しなければTotalPriceの値は最新になりません。

id:artsnet111

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

2007/09/20 13:06:57
  • id:artsnet111
    artsnet111 2007/09/13 18:51:06
    あ、それと今思ったんですが合計値はDBで値を持ったりしないんですか?
    サンプルなどを見るとどこにも合計値を格納していませんね。
    DGVのカラム上で合計値を算出してDBに格納しようと思ってましたが
    本来その必要ってないんですかね?
    表示のたびに計算して合計値を表示すればいいですもんね。
  • id:freemann
    ほかの列の計算から算出される合計値をDBに入れることはあまりないと思われます。もし入れるのであれば、それは合計値を計算するという処理があるためレスポンスが遅くなり、その時間をはぶきたい場合にはDBに合計値を入れることもあるかもしれません。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません