• ベストアンサー

GridViewの行の入れ替えについて

VS2005 ASP.NET GridViewの列を動的に並び替える方法をさがしています. 具体的にはpage_load関数内で 別のファイルやユーザの設定した コントロールの値などから 表示する列を並びを入れ替えたいと思っています. 列のたいとるや数は変わりません。 お力添えをお願いいたします

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.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 といった具合でしょう …

diolab
質問者

お礼

返信ありがとうございます。 インスタンスの生成って 変数宣言だけではダメなんですね. クラスの代入で参照渡しとは C++言語主なもんで思いっきり思い込んでしまいました. 丁寧に教えていただいたおかげで 希望どおりの動作をすることができました 本当にありがとうございます.

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

データベースから取得するフィールドが 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』は同じ事を意味します

diolab
質問者

お礼

返信ありがとうございます。 並び替えについてですが 力技ですが何とかできました。が一つだけ不可解な動きをしてしまいます 並び替えの方法ですが取り合えず全部読み込んでおいて、 必要な項目を任意の順に 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)
回答No.3

動的に変更は可能ですよ 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句などを考慮しておりません

diolab
質問者

お礼

返信ありがとうございます。 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)
回答No.2

たとえば テーブル構造が 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といった順になっています

diolab
質問者

お礼

表示非表示だけではなく実際に並び替えたいのです. SqlDataSouceのSQL文をPage_Loadでいじると ご指摘のようにColumsに操作ができず、 Columsに操作ができるようにすると SQL文が動的に発行できません. そこでGridViewの縦列を入れ替えれないかと考えたのです.

全文を見る
すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

データ自体の行の並び順ということでしょうか それとも列自体の並び順ということですか その並び順を示すコントロールとは何でしょう またどのようなデータを送信しますか グリッドに表示しているデータソースは何でしょう 並び順変更に際して 新たに データベースにSQLを発行するのでしょうか それとも 初回に取得したデータをセッションに登録してありそれを使い回しするのでしょうか

diolab
質問者

お礼

返信ありがとうございます。 情報が足りておらず申し訳ありません. まず、入れ替えたいのは列自体の並び順と言うことです. つまりタイトルと情報を含めた縦列全部を並び替えたいと言うことです. 説明しますと、 現在、SqlDataSourceでSQLServerより情報を取得し、 GridViewコントロールで表示させています. 並び順を示すコントロールはDropdown、checkbox、radiobutton などです. 詳細を示しますと、質問のタイトルは並び替えとなっていますが 正確には任意の位置に列を挿入したいということでもあります. 簡単に言うと、グループのメイン、サブ項目とあり、 メイン項目とサブ項目はまったく別にDBで管理されています. コントロールの選択状況によって サブ項目の挿入位置(順序)が変わるため 取り合えず全部読み込むSQLDataSouceを作っておいて 並び替えようと言うのが質問の内容です. >並び順変更に際して 新たに データベースにSQLを発行するのでしょうか >それとも 初回に取得したデータをセッションに登録してありそれを使い回しするのでしょうか これに関してはどちらでもよいと思っています. というか、DataSourceをセッションに残しておく方法は知りませんでした。 質問事項に答えられているか不安ですが、 返信をおまちしております。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • GridViewのボタンの高さ

    vb.net(vs2005) asp.net GridViewのボタン(buttonfield)の高さを変えられないでしょうか。 ×リンク(文字列に変更し、フォントサイズを小さくする。) ×テンプレート列 以外でお願いします。 つまらないところで、困っています。(表が大きいので…)

  • ASP.NetのGridViewで任意の行クリックで選択を行う方法

    ASP.NetのGridViewコントロールで、「選択」ボタンを表示せずに、グリッド行内の任意の場所をクリックすることでその行を選択する方法がわかりません。 DataGridコントロールについての実装方法はみつけたのですが(下記URL)、同じようにGridViewコントロールで実装すると「無効なポストバックまたはコールバック引数です」というサーバーエラーが発生してしまいます。 どなたか実装する方法についてご存知の方いらっしゃいましたら宜しくお願いします。 http://www.microsoft.com/japan/msdn/vs/WebApplication/vbtchTopQuestionsAboutASPNETDataGridServerControl.aspx#vbtchtopquestionsaboutaspnetdatagridservercontrolselectingrows

  • GridView上で押下したボタンの区別の方法

    こんにちは。 今、GridViewに読み込んだレコードの行順番を入れ替えたいと思っています GridViewにボタンフィールドを二つ足して CommandNameをSelectにしました。 入れ替えるためにGridView.SelectedIndexで何行目が 押されたのか知りたいので、Selectにしています。 入れ替えるコードはできたのですが、 上に移動のボタンを押しても 下に移動のボタンを押しても 同じSelectedIndexChanged関数が呼ばれてしまい 困っています。 どちらのボタンを押したのか区別する方法はありますでしょうか? 押したボタンの行数がわかれば別の方法でもかまいません。 お力添えをお願いいたします。 以下、テーブルイメージ [編集] 列1~列xx [↑][↓] [編集] 列1~列xx [↑][↓] [編集] 列1~列xx [↑][↓]       ・ [編集] 列1~列xx [↑][↓]          ^^^^^^^^^           ↑↑ この二つのボタンのどちらを押したか区別したい

  • UpdatePanel と GridViewについて教えてください

    現在、ASP.NET(VB)にて開発を行っています。今悩んでいる事は GridView内でUpdatePanelを使用した際にエラーが表示されます。 エラー内容は下記の通りです。 InvalidCastException はユーザーコードによってハンドルされませんでした。 ______________________________________________________________________ 型 'System.Web.UI.UpdatePanel' のオブジェクト型 'System.Web.UI.WebControl.GridViewRow' にキャストできません。 どなたか、エラーの対処方をご存知の方がいらっしゃいましたらご指導宜しくお願いします。なお、ソースは下記の様に記述してみました。 <%@ Page Language="VB" %> <%@ Import Namespace="System.Data.SqlClient" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> Protected Sub TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Dim txt As TextBox = DirectCast(sender, TextBox) Dim row As GridViewRow = DirectCast(txt.Parent.Parent, GridViewRow) CD.Text = txt.Text End Sub </script> <html> <body> <form id="form1" runat="server"> <asp:ScriptManager ID="SM" runat="server"> </asp:ScriptManager> <asp:TextBox ID="CD" runat="server" Width="50px"></asp:TextBox> <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataKeyNames="CD" DataSourceID="Source" ShowFooter="True"> <Columns> <asp:TemplateField HeaderText="CD"> <ItemTemplate> <asp:Label ID="lbl" runat="server" Text='<%# Bind("CD") %>'></asp:Label> </ItemTemplate> <FooterTemplate> <asp:UpdatePanel ID="UP" runat="server"> <ContentTemplate> <asp:TextBox ID="NewCD" runat="server" AutoPostBack="True" OnTextChanged="TextChanged" Width="50px"></asp:TextBox> </ContentTemplate> </asp:UpdatePanel> </FooterTemplate> </asp:TemplateField> </Columns> </asp:GridView> <asp:SqlDataSource ID="Source" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionStrings %>" SelectCommand="SELECT * FROM [TABLE]" ProviderName="System.Data.SqlClient"> </asp:SqlDataSource> </form> </body> </html>

  • GridViewからの値を全件LOOPして取得したい

    GridViewについて教えてください。 <環境>ASP.NET データソースにSQLDataSourceを指定し、GridViewに全件を自動バインドして表示しています。 画面上に設置したボタン押下のイベントハンドラで、そのGridViewの全行をループして各列の値を参照したいのですが、 以下のようなに記述しても(1)の部分でNOTHINGとなりエラーになります。 どのようにすればよいでしょうか? やりたいことは、GridView全行ループし、ITEMKINDの値が"1"の時、TemplateField内にあるtxtNVERCHARの値を取得することです。 ご教授お願いします。 --------------------------------- <Columns> <asp:BoundField DataField="ITEMKIND" HeaderText="ITEMKIND" Visible="False" /> </asp:BoundField> <asp:TemplateField HeaderText="ITEM"> <ItemTemplate> <asp:TextBox CssClass="txtstr" ID="txtNVERCHAR" runat="server" Text='<%# Bind("ITEM_NVERCHAR", "{0}") %>'></asp:TextBox> </ItemTemplate> </asp:TemplateField> </Columns> --------------------------------- Protected Sub 更新_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnExec.Click For Each row As GridViewRow In grdList.Rows Dim strITEMKIND As TextBox = DirectCast(row.FindControl("ITEMKIND"), TextBox)  ←(1) IF strITEMKIND.Text = "1" THEN Dim strDDL As TextBox = DirectCast(row.FindControl("txtNVERCHAR"), TextBox) End IF Next End Sub

  • gridviewをcsvダウンロード

    何度もお世話になります。 提題のとおり、gridviewで表示させた内容をcsvでダウンロードさせたいと思っています。 (1)ボタン押下 (2)ポップアップでダウンロード確認画面 (3)保存ボタンを押すとファイル名およびファイル保存場所を指定する画面へ (4)OKで指定ファイル名で指定のファイル保存場所へ VS C#で開発する際にはSaveFileDialogに頼っていたのですが、 ASP.NET C#にはないのでしょうか… 何度も初歩的な質問申し訳ありませんが、ご存じの方、教えていただけると幸いです。 以上、よろしくお願いいたします。

  • GridViewにバインドせずにデータを表示する方法

    環境:VS2008&VB.NET&ASP GridViewに手動でテーブルからデータを読みデータバインドせず DBの値を表示する方法を考えていますがうまくいかず困っています。 (データバインドしたくない理由はデータバインドを行っていると行の挿入や移動ができない認識のためです。) 初心者のため見当違いなことをしているかもしれませんが それも含めまして質問させていただきます。 質問1 そもそもGridViewでデータバインドせずに手動でデータを表示することは可能でしょうか。 質問2 以下のコードで試しましたが「GridView1.Controls(0).Controls.Add(row1)」でExeptionが発生してしまいました。 手順に不適格な箇所があるのでしょうか。 strSql = "SELECT * FROM Data_Table" Using connection As New SqlClient.SqlConnection(cnStr) Dim command As New SqlClient.SqlCommand(strSql, connection) connection.Open() Dim dr As SqlClient.SqlDataReader = command.ExecuteReader While (dr.Read = True) 'データあり str1 = dr("data1") str2 = dr("data2") str3 = dr("data3") End If connection.Close() Dim item1 As DataGridItem item1 = New DataGridItem(-1, -1, ListItemType.Item) Dim cell0 As TableCell = New TableCell item1.Cells.Add(cell0) Dim cell1 As TableCell = New TableCell item1.Cells.Add(cell1) Dim cell2 As TableCell = New TableCell item1.Cells.Add(cell2) Dim row1 As New GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal) row1.Cells.Add(cell0) row1.Cells.Add(cell1) row1.Cells.Add(cell2) GridView1.Controls(0).Controls.Add(row1) End While End Using エラーの内容 System.ArgumentOutOfRangeException はユーザー コードによってハンドルされませんでした。 Message="指定された引数は、有効な値の範囲内にありません。 パラメータ名: index" お力添えをよろしくお願い致します。

  • GridViewの項目編集(初歩)

    いわゆるレガシー言語専門の技術者です。 事情があって、ASP.NETとVisualStudio2008(C#)でWebアプリを知人から頼まれて作っています。 クライアント/サーバ型のシステム開発歴は長いのですが、Web系は全くと言って良いほど経験がありません(個人商店のホームページを作ったくらいです)。 要件は以下のようになります。 検索条件を入力 →DBのマスタ検索 →対象データをGridViewに一覧表示 →項目を直接編集  ※解説サイトによくある、GridViewにボタンが配置してあって、ボタン押下で編集モードに移行する動きはNGです。あくまでも直接編集できなければいけません。 →入力後、更新ボタン押下により、画面情報でDB一括更新 この、GridViewの項目を直接編集するには、何というコントロールを使い、データベースと連動させるにはどうすれば良いのかが、さっぱりわかりません。 自力で頑張ってみたのですが、DBの値をGridViewに表示するには、asp:BoundField を使い、DataField にDBの項目名を指定すれば「表示」はされるところまでは確認できました。 ただ、これだと「編集」が出来ない...どうやら、asp:TemplateField というものを使うようだが、DBとバインドさせる方法は?編集可能にするには? ネットで色々と調べたのですが、(理解力が低いせいもあり)そのものズバリな表現で説明しているサイトは殆どなく、頭がパニックで力が尽きてしまいそうです。 私はWeb開発には向いていないのかも知れませんが、諸事情により、今回は何としてもやり遂げないといけません。 どなたか助けてください、よろしくお願いします。

  • ASP.NET2.0 GridViewのページャー設定について

    お世話になります。 現在VS2005のASP.NETを学習しております。 GridViewコントロールのページャー設定について質問があります。 500レコード程のデータを1ページに10件ずつ表示しようと思い、 GridViewコントロールのPagerSettingsプロパティのVisibleをTrueに設定しました。 それだけでテーブル下にページ番号リンクが表示され、とても簡単で感動しました。 その後、同じくPagerSettingsプロパティのModeをNumericからNextPreviousに変更するなど、いろいろ試していました。 そこで気づいたのですが、そのモードの中にFirstLastとNumericが一緒になったものはあるのですが、 NextPreviousとNumericが一緒になったモードがありません。 冷静に考えると現在のページ番号の両隣のリンクを押せばいいだけなのですが、 頑固な方がどうしてもページ番号と前へ・次へボタンを一緒にしてくれと頼まれた場合、 そのようにカスタマイズすることは可能なのでしょうか? また可能な場合、どのようにすれば実現できるのでしょうか? 知っている方がいたら、どうぞ宜しくお願いします。

  • 各イベントの共通の前処理は存在する?(VB.NET)

    VS.NET2003,VBについての質問です。 ASP.NETでは、WebControlsのイベントを発生させるたびに(ボタンを押したり、テキスト変更したりなど)、 Page_Load>WebControlsイベントの順番で、イベントが発生することを確認しました。 Windowsアプリケーションにおいて、上記のPage_Loadに該当するイベントは存在するでしょうか。 つまり、Windows.Formsコントロールのイベント処理が発生するたびに、その前処理として実行される、上記のPage_Loadのような共通のイベントは存在するでしょうか。 以上、どうぞよろしくお願い致します。