- ベストアンサー
GridViewの行の入れ替えについて
VS2005 ASP.NET GridViewの列を動的に並び替える方法をさがしています. 具体的にはpage_load関数内で 別のファイルやユーザの設定した コントロールの値などから 表示する列を並びを入れ替えたいと思っています. 列のたいとるや数は変わりません。 お力添えをお願いいたします
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
削除せずにやると追加した列は 元の列の参照ですので プロパティを共有してしまうとも思います BoundFieldクラスの変数をnewで新たなインスタンスを起こして DataFieldやHeaderTextプロパティなどを設計時に変更したプロパティを新規のオブジェクトに設定して追加してみましょう 何かのイベントで列を特定し、その列番号から新規の列を追加 dim field as DataContolField = GidView1.Colmuns(n) if TypeOf fields is BoundField then dim NewField as new BoundField() dim OrgField as BoundField = CType( field, BoundField ) ' 設計時にデフォルトから変更したプロパティをすべて設定する NewField.DataField = OrgField.DataField NewField.HeaderText = OrgField.HeaderText field.Visible = false GridView1.Columns.Add( NewField ) end if といった具合です 元の位置にあるものを生かすようにするなら dim flg as boolean = False For n as Integer = 0 to GridView1.Columns.Count -1 if GridView1.Columns(n).HeaderText = "削除対象の列" then if flg = false then ' 最初に見つかったのはオリジナルなので削除しない flg = true GridView1.Columns(n).Visible = true else ' 2回目以降の項目は削除する GridView1.Columns(n).RemoveAt(n) end if end if next といった具合でしょう …
その他の回答 (4)
- redfox63
- ベストアンサー率71% (1325/1856)
データベースから取得するフィールドが GridViewのデザイン時設定した物がすべて含まれるようにすれば動的な発行でも問題ないはずです 足らない場合はページの構築をする際に例外が発生すると思います 列の順序の変更は GridViewのColumnsコレクションに対してRemove、Addを繰り返せば可能なのですが 任意の位置への挿入は簡単には実現できないようです たとえば ID,NameA,NameB,NameC,NameD といた場合に ID,NameA, NameD,NameB,NameC といった順序に変更するなら Dim col as DataControlField for n as integer = 1 to 2 ' colは n=1の場合 NameB列 ' n=2の場合 NameC列 col = GridView1.Columns(2) GridView1.Columns.Remove( col ) GridView1.Colmuns.Add( col ); next といった具合です スマートタグの > 列の自動生成にチェックしたときと似ています と『AutoGenerateColumns』は同じ事を意味します
お礼
返信ありがとうございます。 並び替えについてですが 力技ですが何とかできました。が一つだけ不可解な動きをしてしまいます 並び替えの方法ですが取り合えず全部読み込んでおいて、 必要な項目を任意の順に Dim col as DataControlField col = GridView1.Columns(index) GridView1.Colmuns.Add( col ) として後ろに追加しておいて 最初に読み込んでおいたものを非表示にするという方法を考えました しかし、次のようにコピー元を非表示にすると GridView1.Columns(index).Visuvle = False GridView1.Colmuns.Add( col ) で追加した方も非表示になってしまいます. これは、こういうものなのでしょうか? 何とか別として扱うことはできないのでしょうか? >スマートタグの >> 列の自動生成にチェックしたときと似ています >と『AutoGenerateColumns』は同じ事を意味します なるほど、そうですか。ありがとうございます. >データベースから取得するフィールドが GridViewのデザイン時設定し >た物がすべて含まれるようにすれば動的な発行でも問題ないはずです こちらについては確認ができませんでした GridViewで列をすべて追加しておいて SQLを動的にかえたのですが、どうもエラーになってしまいます. こちらについてはもう少しためしてみます
- redfox63
- ベストアンサー率71% (1325/1856)
動的に変更は可能ですよ SqlDatSource1のSelectCommandプロパティを構築しなおして Selectメソッドを実行 GridViewのDataSourceの設定と DataBindメソッドを実行すればいいようです たとえば SELECT ID, NAME FROM tblMaster といったSQL文のデータソースがあった場合に tblMaster.CodeBとtblCodeB.ID_Bで連結されていて tblCodeB.NameBを追加するなら # コードは VB.NETにて記述しています Dim nIndex as Integer = SqlDataSource1.SelectCommand.IndexOf( "FROM" ) - 1 ' SQL文の『FROM』以前を取得 Dim s1 as String = SqlDataSource1.SelectCommand.SubString( 0, nIndex ) ' 追加項目を文字列に追加 s1 += ", tblCodeB.NameB" ' FROM 以下を追加 s1 += SqlDataSource1.SelectCommand.SubString( nIndex ) ' テーブル間の結合を追加 s1 += " INNER JOIN tblCodeB ON tblMaster.CodeB = tblCodeB.ID_B" ' 出来上がった文字列を設定 SqlDataSource1.SelectCommand = s1 ' データベースに問い合わせ SqlDataSource1.Select( new DataSourceSelectArguments() ) ' DataBindを実行するための設定 GridView1.DataSource = SqlDataSource1 GridView1.DataBind() といった具合です GridView1のDataSourceはデザイン時には設定しないようにします また AutoGenerateColumnsはTrueに設定しておきましょう SQL文再構築はWHERE句やGROUP BY句などを考慮しておりません
お礼
返信ありがとうございます。 SQL文を動的に作成することで 順番は思い通りにできました。が、 ヘッダの編集ができなくなってしまいました. AutoGenerateColumnsはTrueにすると、 ヘッダの背景の色などの編集をしようとすると エラーになってしまうようになってしまいました この状況はGridViewの列の編集で 列の自動生成にチェックしたときと似ています また、HyperLinkの列を追加してそこに 「ID」と言う列の値を使ってリンクを貼っています. これまではID列を読み込んでおいて GridView.Colums(idx).visible=false と言うように見えなくしていたのですが これもエラーになってしまいました >SqlDataSouceのSQL文をPage_Loadでいじると >ご指摘のようなColumsへの操作ができず、 >Columsに操作ができるようにすると >SQL文が動的に発行できません. 分かりにくくて申し訳ありません. 上記はそういうつもりで書いたつもりでした. やはり、SQL文の動的発行と Columsの編集は両立できないのでしょうか?
- redfox63
- ベストアンサー率71% (1325/1856)
たとえば テーブル構造が TableM ... ID,Name,CodeA,CodeB TableA .... CodeA,ItemNameA,CommentA TableB .... CodeB,ShipDate,CommentB といった状態で ID,Name,ItemNameA,ShipdDate といった項目を返すデータソースを作成したとします チェックボックスリストで ItemNameA,ShipDateを表示/非表示を制御するなら SelectedIndexChanged イベントで GridView1.Columns[2].Visible = CheckBoxList.Items[0].Select; GridView1.Columns[3].Visible = CheckBoxList.Items[1].Select; といった具合で可能になります このColumnsは0ベースの配列ですので ID=0、Name=1といった順になっています
お礼
表示非表示だけではなく実際に並び替えたいのです. SqlDataSouceのSQL文をPage_Loadでいじると ご指摘のようにColumsに操作ができず、 Columsに操作ができるようにすると SQL文が動的に発行できません. そこでGridViewの縦列を入れ替えれないかと考えたのです.
- redfox63
- ベストアンサー率71% (1325/1856)
データ自体の行の並び順ということでしょうか それとも列自体の並び順ということですか その並び順を示すコントロールとは何でしょう またどのようなデータを送信しますか グリッドに表示しているデータソースは何でしょう 並び順変更に際して 新たに データベースにSQLを発行するのでしょうか それとも 初回に取得したデータをセッションに登録してありそれを使い回しするのでしょうか
お礼
返信ありがとうございます。 情報が足りておらず申し訳ありません. まず、入れ替えたいのは列自体の並び順と言うことです. つまりタイトルと情報を含めた縦列全部を並び替えたいと言うことです. 説明しますと、 現在、SqlDataSourceでSQLServerより情報を取得し、 GridViewコントロールで表示させています. 並び順を示すコントロールはDropdown、checkbox、radiobutton などです. 詳細を示しますと、質問のタイトルは並び替えとなっていますが 正確には任意の位置に列を挿入したいということでもあります. 簡単に言うと、グループのメイン、サブ項目とあり、 メイン項目とサブ項目はまったく別にDBで管理されています. コントロールの選択状況によって サブ項目の挿入位置(順序)が変わるため 取り合えず全部読み込むSQLDataSouceを作っておいて 並び替えようと言うのが質問の内容です. >並び順変更に際して 新たに データベースにSQLを発行するのでしょうか >それとも 初回に取得したデータをセッションに登録してありそれを使い回しするのでしょうか これに関してはどちらでもよいと思っています. というか、DataSourceをセッションに残しておく方法は知りませんでした。 質問事項に答えられているか不安ですが、 返信をおまちしております。
お礼
返信ありがとうございます。 インスタンスの生成って 変数宣言だけではダメなんですね. クラスの代入で参照渡しとは C++言語主なもんで思いっきり思い込んでしまいました. 丁寧に教えていただいたおかげで 希望どおりの動作をすることができました 本当にありがとうございます.