ベストアンサー DataGridViewソート時に先頭行を固定する 2013/06/20 15:54 C#のDataGridViewにて列名をクリックした際にソートが発生しますが、 その時、先頭行だけはソートの比較に参加させずに固定しておくことは可能ですか? よろしくお願いします。 みんなの回答 (1) 専門家の回答 質問者が選んだベストアンサー ベストアンサー hirotn ベストアンサー率59% (147/246) 2013/06/20 17:31 回答No.1 Column[index].HeaderTextを設定する方法ではなくて、セルの一行目を除外するのですよね? http://dobon.net/vb/dotnet/datagridview/customsort.html 上記URLのSortCompareイベントを使用する方法が利用できると思います。 ソートの条件で2行目から判断するよう手動で書かなければなりませんが…。 http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridviewsortcompareeventargs.sortresult.aspx によれば、 e.RowIndex1が0の時は常にマイナスの値 e.SortResult2が0の時は常にプラスの値をe.SortResultプロパティに格納すれば、常に一行目を先頭にできると考えます。 それ以外の場合は通常通りのソート条件を実装します。 質問者 お礼 2013/06/21 13:13 ご回答ありがとうございます。 リンク先にてSortCompareイベントについて確認したところ、 DataSourceプロパティに何も設定していないことが条件とのことでした。 しかし残念ながらDataSourceを設定していますので、この方法では出来そうにありません。 せっかく、ご回答いただいたのにすみません。 ただ、このような方法は知らなかったので勉強になりました。 今後参考にさせて頂きます。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発C・C++・C# 関連するQ&A DataGridViewのソートを止めたい いくつか同じ質問は見受けられましたが、自分の環境ではどれも解決に至っていなく困っていますので、質問させてください。 DataGridViewのDataSourceにDataTableを設定して使っています。 このDataGridViewは、編集もできソートもできます。ただ、ソートは、ヘッダをクリックした時など、ユーザーが意図したときだけ起きて欲しく、例えばソート列の値を編集したときなどに、勝手に位置が変わってしまします。 これを、止める方法はないのでしょうか。しかも、それまでに任意のソートを繰り返した後の、編集を加える直前の順番を保ったままです。 ソートを解除するという方法がありましたが、ユーザーが編集直前までに整えた順番をクリアして、最初の状態に戻してしまいます。それでは、都合が悪いのです。 本当に困り果てています。どうか、分かる方教えていただけませんか? DataGridView の sort DataGridView の sort メソッドなどで特定の列のソートを指定していると時、セルの内容を編集するたびに勝手にソートが起こってしまいます。これを止める方法はありますか? できそうで出来ないのです。 つまり、どの列にもソートが設定されていない最初の状態にしたいのです。SortedColumnプロパティは、ReadOnlyで設定できず、sort メソッドの引数にNothingを入れることもできません。。。 いったいどうしたら解除できるのですか??? お願いします!! DataGridView.Sortに入れる引き数 C#を使用しています。 DataGridView.Sort(DataGridViewColumn, ListSortDirection) の命令をしたいのですが、 ListSortDirection引数に何を入れればいいのかわかりません。 数値(int)で降順にしたいのですが。 ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム DataGridViewにて、ソート開始時に起こるイベントとは? VB.NETの質問です。 DataGridViewにて、ソート開始時にイベントを取得したいのですが、そのイベントが見つからず困っています。 ソート完了時ならば、「Sorted」イベントで可能なのですが、、 お分かりになる方がいらっしゃいましたが、ご教授宜しくお願いします。 DataGridViewでのソート制御 はじめまして。 Winアプリを作成していますが、ネットで検索をかけても どうしても分からない事があるのでお教えいただけないでしょうか? 【環境】 Window XP VS2005 VB.net 【質問】 DataGridViewでソートを行う際にデータをNULL(Nothing)にした部分が ソートに反映されてしまうのですが、どうにかソートされないように する方法はありますでしょうか? 例: データ1 データ2 データ3 NULL NULL ソートを行うと NULL NULL データ1 データ2 データ3 希望値としては以下です。 データ1 データ2 データ3 NULL NULL もともとはDataGridViewのグリッドをデータ数に関わらず 常に表示したいことから、行き詰ったのですが どなたか良い方法をご存知ではないでしょうか? よろしくお願いいたします。 DataGridView のソート時のDatasorceの行位置について DataGridViewにDatatableをDatasourceとして設定しています。 画面でカラムタイトルをクリックして、データの並びを変更 した時に、DataGridViewのindexに応じたDatatableのindexを 知る方法を教えて下さい。(伴って変わらないのです) 画面のデータを修正すると、Datatableの値は連携して変わって います。 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のカーソル VB 2005を使っています。 DataGridViewを初期化した際に、ディフォルト状態ではカーソルが先頭行の 先頭カラムに移動します。 またその背景色が青っぽい色となっています。 ここで希望なんですが、カーソルは先頭行、先頭カラムに移動しても構わない のですが、背景色を白っぽい色にしたいのです。 つまり、カーソルがあろうとなかろうと、各行、セルを同一色にしたいのです。 いろいろ調べてみましたが、やりかたがわかりませんでした。 ご存じの方はよろしくアドバイスお願いいたします。 DataGridViewがクラッシュする VB2005を使用しています。 DataGridViewコントロールで、以下のようなコードを実行した際に、 DataGridViewコントロール自体が大きな赤い×の表示になることがあります。 (必ず発生するわけではありません。) 'クリア DataGridView1.Columns.Clear() 'DataSetをDataGridViewに格納 DataGridView1.DataSource = dtData '空の列を追加する DataGridView1.Columns.Add("NOP", "") '最終列の幅をFillにする DataGridView1.Columns("NOP").AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill '編集不可にする For i = 0 To DataGridView1.Columns.Count - 1 DataGridView1.Columns(i).ReadOnly = True Next i '行幅は変更できないようにする DataGridView1.AllowUserToResizeRows = False '行Headerを非表示にする DataGridView1.RowHeadersVisible = False 'セルの選択方法は行毎にする DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect '1行のみ選択にする DataGridView1.MultiSelect = False '追加行は表示しない DataGridView1.AllowUserToAddRows = False '列幅を自動リサイズさせる DataGridView1.AutoResizeColumns() 'DataGridViewのフォントサイズを変更する DataGridView1.Font = New Font(DataGridView1.Font.Name, 11) '行高さを自動リサイズさせる DataGridView1.AutoResizeRows() 'Headerのアライメントを中央にする DataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter 同時に、次のメッセージボックスが表示されます。 「アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。 [続行]をクリックすると、アプリケーションはこのエラーを無視し、続行しようとします。 [終了]をクリックすると、アプリケーションは直ちに終了します。 オブジェクト参照がオブジェクトインスタンスに設定されていません。」 どうすればこのような現象を回避することができるのでしょうか? どうかご教授ください。 エクセル 並び替えの時複数行を固定することは出来ますでしょうか? こんにちは エクセルでデータの並び替えを行う際、複数の行を固定することは可能でしょうか。 先頭行は固定できるのですが。。。 御存知の方お手数ではございますがお教えいただけませんでしょうか。 よろしくお願いいたします。 C#:DataGridViewの行取得 C#のプログラムにて、DataGridViewを使用しています。1列目の複数のセルを選択できるようにしており、その行の番号を知りたいのですが、うまくとれません。1つであれば、 dataGridView.SelectedCells[0].RowIndex が使えるのですが、複数の場合、どのようにすればよいのでしょうか? どうか、教えてください。 多段ソート C言語というよりはアルゴリズムの話です。 [名前], [生年月日] の2つのカラムで表される固定長の行データが羅列されたファイルがあります。 また、各カラムを比較して行をソートした場合にどの行が何番目にくるかといったインデックス情報を木構造で保持したファイルがあります。 (このファイルは行データの追加・削除時に更新される) これらのファイルを利用して、生年月日でソートし、かつ日時が同じ場合は名前順にソートした場合の上から10個分だけのデータを取り出したいのですが、効率のよい方法は無いでしょうか? 全データを読み込んでから、バブルソート等の順序を崩さないソートを多重にかけることはなるべく避けたいのです。 そのためにソート済みのインデックス的な役割を持つファイルを用意しているのですが、多段ソート時にどう応用すればよいのかわからなくなってしまいました。 例 日時、名前の順にソートされた上4つ分のデータが欲しい。 【一覧】 [1行目] 10/20, Aさん [2行目] 11/30, Fさん [3行目] 9/10, Cさん [4行目] 11/30, Bさん [5行目] 12/10, Dさん 【生年月日でソートされた インデックス】 9/10, 3行目 10/20, 1行目 11/30, 2行目 11/30, 4行目 12/10, 5行目 【名前でソートされた インデックス】 Aさん, 1行目 Bさん, 4行目 Cさん, 3行目 Dさん, 5行目 Fさん, 2行目 得たい結果 [3行目] 9/10, Cさん [1行目] 10/20, Aさん [4行目] 11/30, Bさん [2行目] 11/30, Fさん AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム マクロでソートをかけるときにタイトル行を残したいのですが Excel2002での作業です。 ある表があり、名前、数、でソートボタンをマクロで作りたいのです。 名前 数 ---------------- アライ 2 イド 5 スズキ 1 簡単にいうとこんな感じです。 ただ、最初の行をタイトル行として、ソートにはいれたくないのです。 しかも、最初の行は、ウィンドウズ枠固定で、固定したいです。 教えてください。 (以前に、このマクロボタンを作ったのですが、だれかが壊してしまい、ソートするとタイトル行がどこかに混ざってしまうようになってしまいました。この直し方でもいいので教えていただきたいです。) C#でのDataGridViewについて C#でのDataGridViewについてお聞きしたいことがあります。 ボタンを押すことによって1行ずつつ更新・追加をするものを作ったのですが、その際に選択行も更新・追加されたものに一緒に移動させるにはどうすればいいでしょうか? Visual C# の DataGridViewの行や列を増やすにはどうすればいいんでしょうか こちらであってるかどうかも分かりません超初心者です。 Visual C# のコントロールの一つ DataGridViewを使いたいんですが、 普通に行や列を増やすのはできるんですが、 例えば適当なテキストボックスに 4 と 7 を記入したら 4行7列の DataGridViewを作りたいと考えているんですが、どうやればいいのかまったく分かりません。 ネットで調べてもどうすればいいか分かりません ご存じの方どうか教えてください、よろしくお願いします 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から取得したいと思います。アドバイスよろしくお願いいたします<(_ _)> C# .NET DataGridView の行を追加するとデータが消える。 すぐ下に先ほど書いた質問がありますが、こちらに難点か追記してあります。下の質問は後ほど消します。(何でか、今現在消せないそうなので。) 環境 WindowsXP SP2 VisualStudio.NET 2005 C# テストプログラムで、こんなコードを書きました。 private void button1_Click(object sender, EventArgs e) { int iMaxCnt; dataGridView1.Rows.Add(1); iMaxCnt = dataGridView1.RowCount ; dataGridView1.EndEdit(); dataGridView1.Rows[iMaxCnt-1].Cells[0].Value = "たちつてと"; dataGridView1.Rows[iMaxCnt-1].Cells[1].Value = "なにぬめの"; dataGridView1.Rows[iMaxCnt-1].Cells[2].Value = "はひふへほ"; dataGridView1.EndEdit(); } ボタンのクリックイベントなので、これを何度か実行すると、DataGridView の一番下の行だけにデータが表示されてしまいます。(以前のボタン押下時に記入されたデータが消えてしまい、データの変更が確定されていないように見えます。) なぜなんでしょう? DataGridViewで列、行、セルの選択 [環境] Windows7 Professional Visual Studio 2010 Professional お世話になります。 上記環境下にて、DataGridViewを用いたプログラムを 作っております。 そこで、タイトルの件なのですが DataGridViewの一番左(行ヘッダー)をクリックすると行選択、 一番上(列ヘッダー)をクリックすると列選択、 セルをクリックするとセル選択できるようにしたいと思っています。 しかし、DataGridViewのセル選択はSelectionModeという プロパティで制御しているようでして、以下の5種類の選択方法しかないようです。 (1) CellSelect 1 つ以上の個別のセルを選択できます。 (2) FullRowSelect 行のヘッダーまたは行内のセルをクリックすることによって行全体が選択されます。 (3) FullColumnSelect 列のヘッダーまたは列内のセルをクリックすることによって列全体が選択されます。 (4) RowHeaderSelect 行のヘッダー セルをクリックすることによって行が選択されます。個別のセルは、そのセルをクリックすることによって選択できます。 (5) ColumnHeaderSelect 列のヘッダー セルをクリックすることによって列が選択されます。個別のセルは、そのセルをクリックすることによって選択できます。 要するに、 (1)…セル選択のみ可能 (2)…行選択のみ可能(セルクリック時は行選択扱い) (3)…列選択のみ可能(セルクリック時は列選択扱い) (4)…行選択とセル選択のみ可能 (5)…列選択とセル選択のみ可能 ということなので、私の望む、 ・行選択と列選択とセル選択が可能 という制御は無理なのでしょうか。 ご存知の方いましたら、ご教示の程お願い致します。 datagridviewの並べ替え VB2005でDataGridViewを使用して属性番号、日時順、電圧値といったデータ行を表示させています。 複数のcsvファイルから読み込んで表示させていますが、この表示を属性番号順・日時順といった順で並べ替えをしたいのです。 DataGridView.Sortメソッドを使用して 日時列→属性番号列といった順で連続的にソート処理をしています。 が、上手くいきません。 年末の忙しいところ皆さん申し訳ないのですが、知っている方教えて下さい。 最終的には属性順には並んでいますが、最初の日時順が崩れてしまっています。 日時順を元に属性番号順に並べ替える時に、並び順が下がる対象行があるとします。 この並び順が下がる行データの移動先の位置にあった行データが日時を無視して入れ替わりに上がってきてしまっています・・・ よろしくお願いしますm(__)m Bindingsource.Sortが効かない visualstudioでC#を使用しています。 DataGridViewのDataSourceにBindingSourceを使用し、BindingSource.Sortで並び替えを実施しようとしています。 BindingSourceのListやDataGridViewのDataSource.Listを見てみるとソートされているのですが画面には反映されません。。。 BindingSourceのソート関連のプロパティはすべてtrueになっています。 画面の描画に使用しているのはListではないのでしょうか?また、ソートを無効にしてしまうプロパティ等があるのでしょうか? 教えて下さい!お願いします!! 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
ご回答ありがとうございます。 リンク先にてSortCompareイベントについて確認したところ、 DataSourceプロパティに何も設定していないことが条件とのことでした。 しかし残念ながらDataSourceを設定していますので、この方法では出来そうにありません。 せっかく、ご回答いただいたのにすみません。 ただ、このような方法は知らなかったので勉強になりました。 今後参考にさせて頂きます。