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

このQ&Aのポイント
  • ASP.NETの環境で、GridViewにSQLDataSourceを指定し、全件を自動バインドして表示しています。特定の条件を満たす行の値を取得したい場合、GridViewの全行をループして各列の値を参照することができます。
  • 具体的には、ITEMKINDの値が"1"の行のTemplateField内にあるtxtNVERCHARの値を取得したい場合、更新ボタンのイベントハンドラで以下の処理を行います。
  • まず、GridViewの各行をループするために、For Each文を使用します。ループ中の各行に対して、ITEMKINDの値を取得し、条件に合致した場合にはtxtNVERCHARの値を取得します。
回答を見る
  • ベストアンサー

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

noname#208236
noname#208236

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

  • ベストアンサー
  • mdp36
  • ベストアンサー率72% (26/36)
回答No.1

If DirectCast(row.Controls(0), DataControlFieldCell).Text= "1" Then でいけると思います。

noname#208236
質問者

お礼

すみません。 DirectCast(grdList.Rows(I).Controls(2), DataControlFieldCell).Text でできました。 ありがとうございました。

noname#208236
質問者

補足

For I = 0 To grdList.Rows.Count - 1 If DirectCast(row.Controls(0), DataControlFieldCell).Text = "1" Then '~省略~ End If Next ということでしょうか? row.Controlsのrowで「名前'row'は宣言されていません」とエラーなります。もう少し教えてください。

関連するQ&A

  • TemplateFieldで入力制限

    GridViewについて教えてください。 <環境>ASP.NET データソースにSQLDataSourceを指定し、GridViewに全件を自動バインドして表示しています。 GridViewではTemplateField内にtxtNVERCHARをtxtDECIMALを作成し、txtDECIMAL入力後に"\999,999"と表示するよう "\"とカンマ編集をおこないたいと思っています。 txtDECIMALのTextChangedイベントを使えばいいのかと思ったのですがどのように記述すればよいかわかりません。 ご教授お願いします。 --------------------------------- <Columns> <asp:BoundField DataField="NO" HeaderText="NO" Visible="False" /></asp:BoundField> <asp:TemplateField HeaderText="ITEM"> <ItemTemplate> <asp:TextBox ID="txtNVERCHAR" runat="server" Text='<%# Bind("ITEM_NVERCHAR", "{0}") %>'></asp:TextBox> <asp:TextBox ID="txtDECIMAL" runat="server" Text='<%# Bind("ITEM_DECIMAL", "{0:c}") %>'></asp:TextBox> </ItemTemplate> </asp:TemplateField> </Columns> --------------------------------- Protected Sub txtDECIMAL_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Dim textbox As TextBox = DirectCast(sender, TextBox) Dim qty As String = textbox.Text ☆ここからが不明☆ End Sub ---------------------------------

  • GridView でコンボボックスの設定

    再質問をさせていただきます。 gridviewを作成しました。 -------------------------------------------------------------------------------- <asp:GridView ID="grdList" runat="server" DataSourceID="sqldsList"> <Columns> <asp:BoundField DataField="ITEMNO" HeaderText="ITEMNO"></asp:BoundField> <asp:TextBox ID="txtNAME" runat="server" Text='<%# Bind("ITEM_NAME") %>'></asp:TextBox> <ItemTemplate>   <asp:DropDownList CssClass="cnbstr" ID="cnb_KBN" runat="server"     DataSourceID="sqldscnb1" DataTextField="NAME" DataValueField="NO" AutoPostBack="True"></asp:DropDownList> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> -------------------------------------------------------------------------------- このコンボボックスに値を設定させたいのですが、ITEMNO="01"の時だけ、txtNAMEの値を初期表示したいと思っています。 RowDataBound、RowCreatedで可能かと思ったのですができずに困っています。 どなたかご教授お願いします。 Protected Sub grdList_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grdList.RowDataBound   If e.Row.RowType = DataControlRowType.DataRow Then     IF DataBinder.Eval(e.Row.DataItem, "ITEMNO").ToString() = "01" THEN       Dim dlist As DropDownList = DirectCast(e.Row.FindControl("cnb_KBN"), DropDownList)       dlist.SelectedValue = "ITEM_NAME" ←こんな感じのことをしたい     ELSE       設定しない     END IF   End If End Sub

  • 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表示の高速化

    開発環境:VB.NET&ASP いつもお世話になっています。 現在、上記環境でWebアプリの開発を行っていますが GridView表示に時間がかかり過ぎているため表示を高速化する手段を探しています。 現状、GridViewを表示する際には以下の時間がかかっています。 ・270件→約8秒から9秒 ・540件→約35秒から36秒 検索しましたが回避策を得ることが出来ませんでしたので有用な手段など ご存知の方がいらっしゃいましたらご教授いただきたく思います。 よろしくお願い致します。 GridViewは以下の定義となっています。 ------------------------------------------------------------ <asp:ButtonField ButtonType="Button" CommandName="InsertCommand" HeaderText="A" ShowHeader="True" Text="A" /> <asp:ButtonField ButtonType="Button" CommandName="EditCommand" HeaderText="B" ShowHeader="True" Text="B" /> <asp:ButtonField ButtonType="Button" CommandName="MoveCommand" HeaderText="C" ShowHeader="True" Text="C" /> <asp:ButtonField ButtonType="Button" CommandName="PasteCommand" HeaderText="D" ShowHeader="True" Text="D" /> <asp:BoundField DataField="seq" HeaderText="E" SortExpression="E" /> <asp:BoundField DataField="F" HeaderText="F" SortExpression="F" /> <asp:BoundField DataField="G" HeaderText="G" SortExpression="G" /> <asp:BoundField DataField="H" HeaderText="H" SortExpression="H" > <ItemStyle HorizontalAlign="Center" /> </asp:BoundField> <asp:BoundField DataField="I" HeaderText="I" SortExpression="I" /> <asp:BoundField DataField="J" HeaderText="J" SortExpression="J" > <ItemStyle HorizontalAlign="Center" /> </asp:BoundField> <asp:BoundField DataField="K" HeaderText="K" SortExpression="K" ItemStyle-HorizontalAlign="Left" > <ItemStyle HorizontalAlign="Left" /> </asp:BoundField> <asp:BoundField DataField="L" HeaderText="L" SortExpression="L" ItemStyle-HorizontalAlign="Left" > <ItemStyle HorizontalAlign="Center" /> </asp:BoundField> <asp:BoundField DataField="M" HeaderText="M" SortExpression="M" > <ItemStyle HorizontalAlign="Left" /> </asp:BoundField> <asp:BoundField DataField="N" HeaderText="N" SortExpression="N" ItemStyle-HorizontalAlign="Left" > <ItemStyle HorizontalAlign="Center" /> </asp:BoundField> <asp:BoundField DataField="O" HeaderText="O" SortExpression="O" ItemStyle-HorizontalAlign="Left" > <ItemStyle HorizontalAlign="Left" /> </asp:BoundField> <asp:TemplateField HeaderText="P" SortExpression="P"> <EditItemTemplate> <asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# Bind("P") %>' /> </EditItemTemplate> <ItemTemplate> <asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# Bind("P") %>' Enabled="true" /> </ItemTemplate> <ItemStyle HorizontalAlign="Center" /> </asp:TemplateField> ------------------------------------------------------------ VB.NETソース ------------------------------------------------------------ Dim cnStr As String = System.Configuration.ConfigurationManager.ConnectionStrings("connect").ConnectionString strSql = "SELECT E, F, G, H, I, J, K, L, M, N, O, P FROM TABLE_NAME WHERE X = '" & Ddl.SelectedValue & "' ORDER BY E" Dim connection As New SqlClient.SqlConnection(cnStr) Dim adapter As New SqlClient.SqlDataAdapter(strSql, connection) adapter.Fill(ds) GridView1.DataSource = ds GridView1.DataBind() ------------------------------------------------------------

  • GridViewからテンプレートフィールドのEvalにおける、値の取得

    現在VisualStudio2005 ASP.NET VBで作成しております。 現在、GridViewを使用しておりまして、バウンドフィールド、ハイパーリンクフィールド、テンプレートフィールド、 をそれぞれ、配置しております。 <asp:ButtonField DataTextField="expression_no" HeaderText="No" SortExpression="expression_no" Text="ボタン" CommandName="Details" > <ItemStyle CssClass="GridBorder" /> </asp:ButtonField> <asp:BoundField DataField="item_name" HeaderText="商品名" SortExpression="item_name" > <ItemStyle CssClass="GridBorder" /> </asp:BoundField> <asp:TemplateField HeaderText="年額" SortExpression="moneyPerYear"> <ItemStyle HorizontalAlign="Right" CssClass="GridBorder" /> <ItemTemplate> <asp:Label ID="moneyPerYearGrid" runat="server" Text='<%# Eval("moneyPerYear", "{0:c0}") %>'></asp:Label> </ItemTemplate> <FooterTemplate> <asp:Label ID="lblSummary1" runat="server" ForeColor="Red"></asp:Label> </FooterTemplate> <FooterStyle HorizontalAlign="Right" /> </asp:TemplateField> ハイパーリンクフィールドがクリックされたタイミングで、そのクリックされた行の、データを取得したいと考えております。 Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) ' コマンド名が“Details”の場合にのみ処理 If e.CommandName = "Details" Then ' 主キー(isbn列)の値を取得 Dim isbn As String = GridView1.DataKeys(e.CommandArgument).Value.ToString Session("Gridrow") = GridView1.Rows(e.CommandArgument) Dim datarow As TableRow = Session("GridRow") Labaffiliation_name.Text = datarow.Cells(0).Text '証明No Labinsurance_item_name.Text = datarow.Cells(1).Text '商品名 LabPerYearContract.Text = datarow.Cells(2).Text '年金額 End If End Sub 下記のプログラムを実行すると、データが取得できるのはバウンドフィールドでGridViewにデータバインドしている Labinsurance_item_name.Text = datarow.Cells(1).Text '商品名 のみで、他のフィールドのデータが取得できません。 どなたかご教授いただけますと幸いです。

  • gridviewの中のCSSを変更したい

    画面にチェックボックスがあります。 チェックボックスを Trueにした時、gridviewのaタグを有効にし、Falseにした時、無効にしたいと思っています。 vb側のチェックボックスを変更した時に、どのように記述すればよいでしょうか? できなければ、Falseの時に、aタグのclassを空白にしてもいいかなと思っています。 どなたかご教授ください。 <div id="containerData" class="containerData" onscroll="containerHeader.scrollLeft=this.scrollLeft;" runat="server"> <asp:GridView ID="grdList" runat="server" AutoGenerateColumns="False" DataSourceID="sqldsList" CssClass="List" DataKeyNames="NO" SelectionMode="None" CellPadding="0" CellSpacing="0" GridLines="None" > <Columns> <asp:TemplateField HeaderText="番号"> <ItemTemplate> <a class="tooltip" title='<%# Eval("NO") %>'> <custom:textLabel ID="lblNo" CssClass="No detailRow" runat="server" Text='<%# Eval("NO") %>' /> </a> </ItemTemplate> <ItemStyle CssClass="rowStyle"></ItemStyle> </asp:TemplateField> <asp:TemplateField HeaderText="名前"> <ItemTemplate> <a class="tooltip" title='<%# Eval("NAME") %>'> <custom:textLabel ID="lblName" CssClass="Name detailRow" runat="server" Text='<%# Eval("NAME") %>' /> </a> </ItemTemplate> <ItemStyle CssClass="rowStyle"></ItemStyle> </asp:TemplateField> </Columns> </asp:GridView> </ContentTemplate> </div>

  • DataGridViewから値取得

    DataGridViewにボタンと項目2つが配置されています。 DataGridView1 DataGridView1.Columns("btn").HeaderText = "ボタン" DataGridView1.Columns("item1").HeaderText = "アイテム1" DataGridView1.Columns("item2").HeaderText = "アイテム2" ボタンを押すと、押した行のレコードを取得したいです。 ボタンのところを押下すると、 イベントハンドラで何行目か分かるサンプルをネットで見つけました。 惜しいですが、やりたいのと少し違いました。 'CellContentClickイベントハンドラ Private Sub DataGridView1_CellContentClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick Dim dgv As DataGridView = CType(sender, DataGridView) Dim test_item1 As String Dim test_item2 As String ' "btn"列ならば、ボタンがクリックされた If dgv.Columns(e.ColumnIndex).Name = "btn" Then MessageBox.Show((e.RowIndex.ToString() + "行のボタンがクリックされました。")) End If ' ここに押された行のitem1の値をセット ' test_item1 = (A) ' ここに押された行のitem2の値をセット ' test_item2 = (B) End Sub (A)、(B)に何を記述すれば値を取得できますか?

  • ASP.Net GridView TextBoxで

    大変お世話になります。 FormViewにあるGridView を編集状態にした状態で、 Dim Gv As GridView = FormView1.Row.FindControl("GridView1") TextBoxのデータを変更した際に、他のTextBoxの内容を変更したいのですが、 この場合、GridViewのTextBoxのTextChangedイベントを使用しています。 ここで問題なのが、 (1) GridVew の行の Index の取得 (2) TextChangedイベント内での FindControl の記述の仕方 上記のやり方がよくわかりません。 ボタンを使用した場合の Index の取得などはわかるのですが、 GridView1_RowCreated イベントで Dim A As Button = CType(e.Row.FindControl("A"), Button) A.CommandArgument = e.Row.RowIndex.ToString() 上記(1)、(2)はどうしたらよいのかわかりません。 編集状態にあるGridView の Index の取得方法とローカル関数でのFindCotrol メソッドの やり方など、お分かりになる方がいらっしゃいましたら 何卒ご教授いただければと存じます。

  • gridviewの値でセッション書きこみ

    現在、ASP.netにて以下のようなアプリを処理を実施しようとしています。 画面A(gridview使用) ------------------------------- 名前A | 項目A |備考A ------------------------------- 名前B | 項目B |備考B ------------------------------- 名前C | 項目C |備考C ------------------------------- ソース <asp:GridView ID="GridView" runat="server" AutoGenerateColumns="False" DataSourceID="ods1" > <Columns> <asp:BoundField DataField="namae" HeaderText="名前" SortExpression="namae" > </asp:BoundField> <asp:BoundField DataField="koumoku" HeaderText="項目" SortExpression="koumoku" > </asp:BoundField> <asp:BoundField DataField="bikou" HeaderText="備考" SortExpression="bikou" > </asp:BoundField> </Columns> </asp:GridView> このようなときに、2行目をクリックしたときは  session(name) = "B" のようにクリックする行によってsessionを書くにはどうのようにすでばよいのでしょうか? 対応方法があれば教えてください。

  • <ASP>にTextBoxの値を設定する方法

    TextBoxに記述されたDB接続文字列を<ASP>内で設定しようと試みておりますが、失敗します。どのように記述を改めればよろしいでしょうか? ----------------- <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebForm1" %> <script runat="server"> protected void Page_Load(object sender, EventArgs e) { TextBox1.Text = Application["DB_CON_STRING"].ToString(); } </script> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>無題のページ</title> </head> <body> <form id="form1" runat="server"> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <div> </div> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1"> <Columns> <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True" SortExpression="ID" /> <asp:BoundField DataField="DATETIME" HeaderText="DATETIME" SortExpression="DATETIME" /> <asp:BoundField DataField="MESSAGE" HeaderText="MESSAGE" SortExpression="MESSAGE" /> </Columns> </asp:GridView> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="form1.TextBox1.Text"★ここがうまくいかない★ SelectCommand="SELECT * FROM TEST ORDER BY ID DESC"></asp:SqlDataSource> </form> </body> </html>

専門家に質問してみよう