none
如何在GridView中FindControl到該row RRS feed

  • 問題

  • 我有一個GridView動態產生很多row
    而每個row裏面有一個ImageButton
    我希望ImageButton按下去之後,可以FindControl該row裏Label3的值

    string
     n = ((Label)(this
    .GridView1.Rows[0].Cells[0].FindControl("Label3"
    ))).Text; 
    Response.Write(n.ToString()); 
    

    我這樣打 它只次只會找到第一行的Label3的值,但我要如何輸入,才能找到按鈕被按下的那一行呢?

    謝謝指導
    • 已編輯 alan0958s 2009年7月29日 上午 03:17
    2009年7月29日 上午 03:10

解答

  • 你可以在 ImageButton 設定 CommandName,然後在 GridView 的 DataRowCommand 處理,例如:
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="OrderID,ProductID"
            DataSourceID="SqlDataSource1" EmptyDataText="沒有資料錄可顯示。" AllowPaging="True" AllowSorting="True"
            OnRowDataBound="GridView1_RowDataBound" OnRowCommand="GridView1_RowCommand">
            <Columns>
                <asp:TemplateField HeaderText="OrderID" SortExpression="OrderID">
                    <EditItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("OrderID") %>'></asp:Label>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Bind("OrderID") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="ProductID" HeaderText="ProductID" ReadOnly="True" SortExpression="ProductID" />
                <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" SortExpression="UnitPrice" />
                <asp:BoundField DataField="Discount" HeaderText="Discount" SortExpression="Discount" />
                <asp:TemplateField HeaderText="測試按鈕">
                    <ItemTemplate>
                        <asp:ImageButton ID="ImageButton1" runat="server" CommandName="Test" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString1 %>"
            ProviderName="<%$ ConnectionStrings:NorthwindConnectionString1.ProviderName %>"
            SelectCommand="SELECT [OrderID], [ProductID], [UnitPrice], [Quantity], [Discount] FROM [Order Details]">
        </asp:SqlDataSource>
    </div>
    </form>
    cs 檔
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Test")
        {
            string n = ((Label)((ImageButton)e.CommandSource).Parent.Parent.FindControl("Label1")).Text;
            Response.Write(n);
        }
    }
    • 已標示為解答 alan0958s 2009年7月29日 上午 06:03
    2009年7月29日 上午 04:33

所有回覆

  • 你可以在 ImageButton 設定 CommandName,然後在 GridView 的 DataRowCommand 處理,例如:
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="OrderID,ProductID"
            DataSourceID="SqlDataSource1" EmptyDataText="沒有資料錄可顯示。" AllowPaging="True" AllowSorting="True"
            OnRowDataBound="GridView1_RowDataBound" OnRowCommand="GridView1_RowCommand">
            <Columns>
                <asp:TemplateField HeaderText="OrderID" SortExpression="OrderID">
                    <EditItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("OrderID") %>'></asp:Label>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Bind("OrderID") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="ProductID" HeaderText="ProductID" ReadOnly="True" SortExpression="ProductID" />
                <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" SortExpression="UnitPrice" />
                <asp:BoundField DataField="Discount" HeaderText="Discount" SortExpression="Discount" />
                <asp:TemplateField HeaderText="測試按鈕">
                    <ItemTemplate>
                        <asp:ImageButton ID="ImageButton1" runat="server" CommandName="Test" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString1 %>"
            ProviderName="<%$ ConnectionStrings:NorthwindConnectionString1.ProviderName %>"
            SelectCommand="SELECT [OrderID], [ProductID], [UnitPrice], [Quantity], [Discount] FROM [Order Details]">
        </asp:SqlDataSource>
    </div>
    </form>
    cs 檔
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Test")
        {
            string n = ((Label)((ImageButton)e.CommandSource).Parent.Parent.FindControl("Label1")).Text;
            Response.Write(n);
        }
    }
    • 已標示為解答 alan0958s 2009年7月29日 上午 06:03
    2009年7月29日 上午 04:33
  • 您可以透過下列方式獲得RowIndex, ex:

     protected void LinkButton1_Click(object sender, EventArgs e)

        {

            Response.Write(((GridViewRow)(((LinkButton)sender).NamingContainer)).RowIndex);

        }


    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    2009年7月29日 上午 05:41
  • to hunterpo0323

    恩恩 超詳細的 謝謝你

    那可以再請問一下

    我可以不透過GridView1_RowCommand
    直接由ImageButton1_Click去FindControl嗎?

    謝謝指導
    • 已編輯 alan0958s 2009年7月29日 上午 05:51
    2009年7月29日 上午 05:43
  • GridView.Rows[rowindex].FindControl("...");

    小人物一枚。
    2009年7月29日 上午 05:48
    版主
  • to 小朱

        protected void ImageButton2_Click(object sender, ImageClickEventArgs e)
        {
            string n = ((Label)(this.GridView1.Rows[rowindex].FindControl("Label3"))).Text;
            Response.Write(n.ToString());
        }
    
    
    我是這樣打的
    但錯誤碼顯示
    名稱 'rowindex' 不存在於目前內容中

    我是不是忽略了什麼步驟呢?

    謝謝指導
    2009年7月29日 上午 05:57
  • protected void ImageButton2_Click(object sender, ImageClickEventArgs e)
        {
            int  rowindex = (((GridViewRow)(((ImageButton)sender).NamingContainer)).RowIndex;
           
            string n = ((Label)(this.GridView1.Rows[rowindex].FindControl("Label3"))).Text;
            Response.Write(n.ToString());
        }

    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    2009年7月29日 上午 06:01
  • 喔喔 我懂了 配上Lolota Lee 的語法後
    搞定了

    謝謝幾位前輩的指導

    這個分數要怎麼給咧...
    2009年7月29日 上午 06:02
  • 谢谢你的答案,刚搜索到这里。哈哈!正需要!
    2010年4月23日 上午 08:16