アプリ版:「スタンプのみでお礼する」機能のリリースについて

VS2005 ASP.NET

GridViewの列を動的に並び替える方法をさがしています.

具体的にはpage_load関数内で
別のファイルやユーザの設定した
コントロールの値などから
表示する列を並びを入れ替えたいと思っています.

列のたいとるや数は変わりません。

お力添えをお願いいたします

A 回答 (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
といった具合でしょう …
    • good
    • 0
この回答へのお礼

返信ありがとうございます。

インスタンスの生成って
変数宣言だけではダメなんですね.
クラスの代入で参照渡しとは
C++言語主なもんで思いっきり思い込んでしまいました.

丁寧に教えていただいたおかげで
希望どおりの動作をすることができました

本当にありがとうございます.

お礼日時:2008/06/19 20:18

データベースから取得するフィールドが 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』は同じ事を意味します
    • good
    • 0
この回答へのお礼

返信ありがとうございます。

並び替えについてですが
力技ですが何とかできました。が一つだけ不可解な動きをしてしまいます

並び替えの方法ですが取り合えず全部読み込んでおいて、
必要な項目を任意の順に

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を動的にかえたのですが、どうもエラーになってしまいます.

こちらについてはもう少しためしてみます

お礼日時:2008/06/18 19:32

動的に変更は可能ですよ



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句などを考慮しておりません
    • good
    • 0
この回答へのお礼

返信ありがとうございます。

SQL文を動的に作成することで
順番は思い通りにできました。が、
ヘッダの編集ができなくなってしまいました.

AutoGenerateColumnsはTrueにすると、
ヘッダの背景の色などの編集をしようとすると
エラーになってしまうようになってしまいました

この状況はGridViewの列の編集で
列の自動生成にチェックしたときと似ています

また、HyperLinkの列を追加してそこに
「ID」と言う列の値を使ってリンクを貼っています.

これまではID列を読み込んでおいて
GridView.Colums(idx).visible=false
と言うように見えなくしていたのですが
これもエラーになってしまいました

>SqlDataSouceのSQL文をPage_Loadでいじると
>ご指摘のようなColumsへの操作ができず、
>Columsに操作ができるようにすると
>SQL文が動的に発行できません.

分かりにくくて申し訳ありません.
上記はそういうつもりで書いたつもりでした.

やはり、SQL文の動的発行と
Columsの編集は両立できないのでしょうか?

お礼日時:2008/06/17 19:37

たとえば テーブル構造が


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といった順になっています
    • good
    • 0
この回答へのお礼

表示非表示だけではなく実際に並び替えたいのです.

SqlDataSouceのSQL文をPage_Loadでいじると
ご指摘のようにColumsに操作ができず、

Columsに操作ができるようにすると
SQL文が動的に発行できません.

そこでGridViewの縦列を入れ替えれないかと考えたのです.

お礼日時:2008/06/16 20:03

データ自体の行の並び順ということでしょうか


それとも列自体の並び順ということですか

その並び順を示すコントロールとは何でしょう
またどのようなデータを送信しますか

グリッドに表示しているデータソースは何でしょう

並び順変更に際して 新たに データベースにSQLを発行するのでしょうか
それとも 初回に取得したデータをセッションに登録してありそれを使い回しするのでしょうか
    • good
    • 0
この回答へのお礼

返信ありがとうございます。

情報が足りておらず申し訳ありません.
まず、入れ替えたいのは列自体の並び順と言うことです.
つまりタイトルと情報を含めた縦列全部を並び替えたいと言うことです.

説明しますと、
現在、SqlDataSourceでSQLServerより情報を取得し、
GridViewコントロールで表示させています.

並び順を示すコントロールはDropdown、checkbox、radiobutton
などです.

詳細を示しますと、質問のタイトルは並び替えとなっていますが
正確には任意の位置に列を挿入したいということでもあります.

簡単に言うと、グループのメイン、サブ項目とあり、
メイン項目とサブ項目はまったく別にDBで管理されています.

コントロールの選択状況によって
サブ項目の挿入位置(順序)が変わるため
取り合えず全部読み込むSQLDataSouceを作っておいて
並び替えようと言うのが質問の内容です.

>並び順変更に際して 新たに データベースにSQLを発行するのでしょうか
>それとも 初回に取得したデータをセッションに登録してありそれを使い回しするのでしょうか

これに関してはどちらでもよいと思っています.
というか、DataSourceをセッションに残しておく方法は知りませんでした。

質問事項に答えられているか不安ですが、
返信をおまちしております。

お礼日時:2008/06/15 15:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!