• ベストアンサー

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

redfox63の回答

  • 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の編集は両立できないのでしょうか?

関連する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のような共通のイベントは存在するでしょうか。 以上、どうぞよろしくお願い致します。