• 締切済み

C# Windows Formについて

DataGridViewを使い、データの表示を行っております。 内容を保存する為、DataTableとバインドさせて処理を行っているのですが、 DataGridViewのソートを行っても、DataTableに反映されません。 そもそもXML形式で保存すること自体が正しいのかも分からず、困っております。 以上をふまえての質問といたしましては、 (1)データバインドさせたDataGridViewのソート結果の反映について (2)ユーザーが保存ファイルを書き換えできない保存方法について 以上の二つになります。 回答よろしくお願いします。

みんなの回答

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.2

>>(1)ソートキーはあっています。 ソートキーがあっているなら、DataTableをキー順に読み出せば、思うとおりの順番で読めるはずですけどね。 なお、物理的な順序は、データベースとして扱う場合、どうなるか判らないというか、デタラメになるのが普通です。 >>(2)ユーザー編集可能行とプログラムのみ編集可能行が混合しているので、EditModeを使うかと思います。 「ユーザが保存ファイルを書き換えない保存方法」の意味がちょっと違っていたようですね。 保存したファイルをユーザがダイレクトに書き換えできないようにしたいなら、XMLやCSV形式を使うのは間違いです。 SQLServerやOracle、あるいは、MySQLとかAccessなどのデータベースを使います。

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

(1)DataTableのソートキーとグリッドのソートキーが一致していないなら、グリッドでソートしても反映しないのが正しい動作だと思います。 (2)グリッドを書き換え禁止(ReadOnly)にすればいいのでは?

criminal1006
質問者

補足

(1)ソートキーはあっています。  他のサイトを見たところ、DataTableをコピーし、ソートしたものを元のDataTableに反映させる方法が多いみたいです。  その際、データ量が増えていくにつれて処理速度が重くなると思われ、ましてグリッドが5つあるので実用には向かないと考えております。 (2)ユーザー編集可能行とプログラムのみ編集可能行が混合しているので、EditModeを使うかと思います。  また、XMLやCSV形式でデータを保存しても、ユーザーが編集しやすい文字で出力されるので、あまり好ましくありません。  バイナリなどある程度暗号化された形式で保存したいと考えております。それこそ、出力されたファイルにロックをかけるような堅固な造りにしたいです。

関連するQ&A

  • DataGridViewでの変更を即時反映させなくするには?

    VB2005でWindowsアプリを開発しています。 同じDataTableの内容を二つのDataGridViewに表示し、 変更前、変更後というように変更箇所がわかるようにしたいです。 そして、更新ボタンが押下されたら、DataGridViewの変更箇所をDataTableに反映させて、データ(XMLファイル)を更新する、ということをしたいのです。 デフォルトの状態では、DataGridViewを変更したら、DataTableが更新されるため、両方のDataGridViewが同じ表示になってしまいます。 ですので、DataGridViewを変更されても、DataTableには反映させないようにしたいのですが、可能でしょうか? よろしくお願いいたします。

  • DataGridViewで変更した値を反映させたい。

    VB2005、SqlServer2005環境です。 デザイナ上で、DataTableをドラッグしてやると、自動的に バインドされたDataGridViewが出てくれるので、その方法で DataGridViewを1つ設置しました。 このDataGridViewの表の値を変えた時、それを実際のDBのテーブルにも 反映させたいなと思ってます。 これを実現するための方法を教えていただけないでしょうか? バインドされているので、保存できればそのまま更新されるような イメージなのですが…その方法がわかりません。 宜しくお願いします。

  • VB DataGridView 行削除

    Visualbasic 2010 を利用してWindowsFormアプリケーションを開発しております。 データベースはORACLE11を利用しております。 VB側よりOracleDataAdapterを利用してDatatableにORACLEのSELECT結果を格納しています。 DataGridViewには上記のDataTableをDataSourceとして割り当てております。 このDataGridViewに並び替え機能を組み込んでおります。 ※DataViewのSortを利用して並び替えを実現しております。 この後にDataGridViewの行削除を行うと以下の例外が発生します。 一意制約(XXX.PKY_テストデータ)に反しています Oracle.DataAccess.Client.OracleException これはDataTableをSortしたためOracleDataAdapterと一致しなくなったことが原因ではないかと推測しております。 DataGridViewの並び替えを行っても正常に行削除を行いDataTableにも反映する方法が分る方がいらっしゃいましたらご教授頂けないでしょうか。 VBソース抜粋 ・データ抽出 '/ SQLをOracleで実行した結果をデータアダプタに格納 Dadp5 = New OracleDataAdapter("SELECT * from テストデータ", CONFIG.Database) Dadp5.Fill(dt_test) Me.DataGridView_TEST.DataSource = dt_test ・並び替え(降順) Dim dv = New DataView(dt_test) dv.Sort = "テストコード DESC" dt_test = dv.ToTable Me.H_DataGridView_test.DataSource = dt_test ・行削除 Dim scBuilder As New OracleCommandBuilder(Dadp5) '/ データグリッドビューの編集内容をデータベースへ反映 '/ 生成されたSQLを実行する Dadp5.Update(dt_test) ※ここで例外が発生致します。 お手数おかけ致しますが宜しくお願い致します。 以上です。

  • DataGridViewで行選択して、対応するDataTableの行を得るには?

    いつもお世話になっております。VB2005環境です。 DataGridViewの行を選択したときに、そのソースであるDataTableの同じ行のデータを参照するには、どうしたらいいでしょうか。DataTableのデータをまるごとDataGridViewに表示しているわけではないので、必要に応じて直接DataTableから取得したいです。とても初歩的な質問だと思うのですが・・・。 DataGridView1.DataSource = DataTable  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ Dim r As Integer = DataGridView1.CurrentCell.RowIndex Dim str As String str = DataTable.Rows(r)("項目名") MsgBox(str)  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ このように行インデックスを取得してやってみたのですが、これだとDataGridView上でソートすると行番号が変わってしまい、DataTable側の対応する行のデータが得られません。 もう少し詳しく現状を書くと、まずCSVファイルからデータをロードして、DataTableに渡しています。そして、その内容をDataGridViewに表示しているのですが、表示する内容はデータテーブル通りの構造ではなく、表示する必要がある項目だけを選んで、1つずつカラムを追加してバインドいます。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ’自動で列を追加しないようにする DataGridView1.AutoGenerateColumns = False ’データソースを指定する DataGridView1.DataSource = DataTable ’1つ1つ順番などを変えながら列を追加していく Dim column1 As New DataGridViewTextBoxColumn() DataGridView1.Columns.Add(column1) column1.Name = "Date" column1.HeaderText = "日付" column1.DataPropertyName = "F4" Dim column2 As New DataGridViewTextBoxColumn() DataGridView1.Columns.Add(column1) column1.Name = "Locatoin" column1.HeaderText = "場所" column2.DataPropertyName = "F1" ・ ・ ・  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ こんな感じでなので、表示されていない列のデータについては、必要に応じて直接DataTableから取得したいと思います。アドバイスよろしくお願いいたします<(_ _)>

  • DataTableの件数に関して

    フォーム上に”DataGridView”を貼り付け、そこへ1行ずつ、複数行データを入力するような 事を考えています。 厳密には、”DataGridView”のセルをダブルクリックした時に、他のDBから検索された 結果を貼り付ける(表示)ような事をしています。 その際に、”Datatable”と”DataGridView”をバインドし、ダブルクリックされたら”DataTable” へ追加し表示というような事をしていますが、1件目(1行目)をクリック⇒表示、2件目(2行目) クリック⇒表示という場合には正しく表示されますが、1件目(1行目)クリック⇒表示の後、再度 1行目をクリックして表示した場合、なぜか”DataTable”の件数が、追加もしていないのに 最初から2件となっていて、さらに処理が終わった後には、2件となっているはずが3件となって いて、さらに空白の行が追加されてしまっています。 どうしてもこの現象から脱する事ができず、助けて頂ければと思います。 “DataTable”への追加は、問題ないかとは思われますが、、、 ★ 記述内容 Dim data_row As DataRow = dtTable.NewRow() data_row("発注番号") = PIN_発注番号 data_row("発注日付") = KIN_発注日付 dtTable.Rows.Add(data_row) DataGridView1.DataSource = dtSet.Tables(0) 教えて下さい。 よろしくお願いします。

  • DataGridView スクロール時の描画速度

    Visualbasic 2013 でWindows Form アプリを開発しております。 DataGridViewにOracleのテーブルより抽出した結果を 10,000レコードを表示する必要があります。 ※DataTableをバインドしてDataGridViewのDataSourceに指定しています。 表示自体は問題なく実装できているのですが、 スクロール時の描画が遅いため実運用では支障がでると考えられます。 スクロール時の描画速度を向上する施策として何か分る方が いらっしゃいましたらご教授頂けますと幸いです。 現時点では以下のような実装としております。 ・DoubleBufferedを有効にしております。 ・1レコードごとにデータ妥当性チェックを行っております。  ※DataTableの全行ループしチェックNGの場合セルの背景色を赤色にしています。

  • C# ファイルについて

    Windows Formを作成中にぶち当たった壁なのですが、 パラメータ(テキストボックスなど)の保存方法についてです。 XMLやバイナリファイルに保存するのが一般的なそうですが、 ここで一つ疑問です。 通常、テキストファイルやOfficeなどのファイルは保存すると、 編集したファイルのみが指定したフォルダ上に生成されますが、 Windows Formの場合、アプリケーション上に保存といった形を取ることは出来ないのでしょうか? もっともexe形式なので、出来ないとは思いますが。 また、DataGridViewをListに格納し、CSV形式で、保存・読込を行っていますが、 バイナリ形式にすることは可能でしょうか? XML形式でも構いません。 回答よろしくおねがいします。

  • C#のDataGridViewにCheckBox

    VC#2013でソフトを作成しています. xmlに保存したデータをform上のdataGridViewに表示させたいと考えています. xmlのデータは下記のようになります. <?xml version="1.0" standalone="yes"?> <setting> <test> <No>1</No> <直径>43.1</直径> <全長>43.2</全長> <可>true</可> </test> </setting> xmlを読み込んでfrom上のdataGridViewに表示させるコードは下記のようになります. setting.ReadXml(Directory.GetCurrentDirectory() + "\\setting.xml"); dataGridView1.DataSource = setting; dataGridView1.DataMember = "test"; 上記コードを実行し、<可>の列だけ、checkBoxにしたいと考えていますが、 trueと表示されてしまいます. 多分ですが、string型であるからだと思いますが、どのようにすればcheckBoxを表示することが出来ますでしょうか? 何卒、ご教授宜しく御願い致します.

  • DataGridViewのソートを止めたい

    いくつか同じ質問は見受けられましたが、自分の環境ではどれも解決に至っていなく困っていますので、質問させてください。 DataGridViewのDataSourceにDataTableを設定して使っています。 このDataGridViewは、編集もできソートもできます。ただ、ソートは、ヘッダをクリックした時など、ユーザーが意図したときだけ起きて欲しく、例えばソート列の値を編集したときなどに、勝手に位置が変わってしまします。 これを、止める方法はないのでしょうか。しかも、それまでに任意のソートを繰り返した後の、編集を加える直前の順番を保ったままです。 ソートを解除するという方法がありましたが、ユーザーが編集直前までに整えた順番をクリアして、最初の状態に戻してしまいます。それでは、都合が悪いのです。 本当に困り果てています。どうか、分かる方教えていただけませんか?

  • [C#] DataGridViewでコンボボックスでの変更がdataTableに反映されません

    DataGridViewへのコンボボックス利用で躓いております。 DataGridViewのAutoGenerateColumnsをfalseにし、dataGridView.DataSourceにデータベースから読み込んだデータテーブルを指定しています。 次にdataGridViewにDataGridViewComboBoxColumnを追加し、DataPropertyNameにコンボボックスに対応させたい データテーブルのCaptionを指定することで、データテーブルとコンボボックスを関連付けています。 実行後の表示は想定通りなのですが、コンボボックスでアイテムを選択するとdataGridView上では値が更新されて、データテーブルには変更が反映されていません。 ちなみにコンボボックスでは、ValueMemberとDisplayMemberを設定し、DataGridView上ではstring、 内部的にはlongでデータ管理を行いたいと思っています。 どうにも解決方法が見いだせないので、こちらに質問させていただきました。 ソースを貼りつけるのでご指摘をお願いします。 利用しているデータベース |ID|ペットID| |1 |1| |2 |1| |3 |3| 以下ソースでは上記データベースのデータテーブルをpdtとしています。 コンボボックスのデータテーブル作成 DataTable comboTable = new DataTable(); comboTable.Columns.Add("ID", typeof(long)); comboTable.Columns.Add("NAME", typeof(string)); string[,] rowDataArray =      {{"1", "犬"},      {"2", "猫"},      {"3", "魚"}}; for(i=0;i<rowDataArray.GetLength(0);i++) {    DataRow row = comboTable.NewRow();    row["ID"] = rowDataArray[i, 0];    row["NAME"] = rowDataArray[i, 1];    comboTable.Rows.Add(row); } comboTable.AcceptChanges(); //コンボボックスを作成しコンボボックステーブルをバインド DataGridViewComboBoxColumn cbc = new DataGridViewComboBoxColumn(); cbc.DataSource = comboTable; cbc.DisplayMember = "NAME"; cbc.ValueMember = "ID"; cbc.DataPropertyName = pdt.ペットIDColumn.Caption; cbc.DisplayStyleForCurrentCellOnly = true; //dataGridViewにデータテーブルをバインド dataGridView1.AutoGenerateColumns = false; dataGridView1.DataSource = pdt; dataGridView1.Columns.Add(cbc); これを実行すると |犬| |犬| |魚| とdataGridViewに表示され、コンボボックスでは、犬、猫、魚が選べます。 一行目において、コンボボックスから猫を選択するとdataGridViewは下記のようになるのですが |猫| |犬| |魚| この後ブレークよりデータテーブルとdataGridViewを見ると pdt[0][0] = 1 dataGridView1.Rows[0].Cells[0].Value = 2 となっており、dataGridViewの値は更新されているのに、データテーブルでは更新されていませんでした。 今まで、dataGridView上でダブルクリックし、値を直接書き換えていたらデータテーブルの値も更新されていたのですが、 コンボボックスを使うようにしたら更新されなくなりました。 皆様、解決方法を教えていただけますでしょうか。

専門家に質問してみよう