如何获取 gridview 中选定行中的文本框值

How can i get the textbox value in selected row in gridview

我正在用 c# 开发一个项目asp.net。

我创建了一个网格视图并将其连接到数据库。我的代码就是这样;

<asp:GridView ID="GridView1" runat="server" 
                class="table table-bordered table table-hover " AutoGenerateColumns="false"  HeaderStyle-Height="40px" OnRowCommand="GridView1_RowCommand1"  >

            <Columns>
                 
                 <asp:TemplateField HeaderText="Numune Parçası" >
                 <ItemTemplate>
                 <asp:Literal ID="Literal22" runat="server" Text='<%# Eval("Açıklama") %>'></asp:Literal> 
                    </ItemTemplate>
                   </asp:TemplateField>

                  <asp:TemplateField HeaderText="Analiz">
                    <ItemTemplate>
                        <asp:Literal ID="Literal112" runat="server" Text='<%# Eval("Analiz") %>'></asp:Literal> 
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Tartım"  ItemStyle-Width="10%">
                    <ItemTemplate>
                        <asp:TextBox id="txttartim" runat="server" class="form-control"  ></asp:TextBox>
                    </ItemTemplate>

                <ItemStyle Width="10%"></ItemStyle>
                </asp:TemplateField>

                 <asp:TemplateField HeaderText="Birim">
                    <ItemTemplate>
                    <asp:DropDownList ID="birimlist" class="form-control" runat="server" >
                    <asp:ListItem>g</asp:ListItem>
                    <asp:ListItem>mg</asp:ListItem>
                    <asp:ListItem>ml</asp:ListItem>
                    <asp:ListItem>cm2</asp:ListItem> 
                    </asp:DropDownList>
                    </ItemTemplate>               
                </asp:TemplateField>

                 <asp:TemplateField HeaderText="Kaydet">
                       <ItemTemplate>        

                    <asp:LinkButton ID="Btn_Indir" runat="server"  
                         class="btn btn-primary btn-sm" Text="Kaydet" CommandName="Open" CommandArgument='<%# Eval("ID") %>' />                                                                                               
                       </ItemTemplate>
                       </asp:TemplateField>



            </Columns>
                <HeaderStyle BackColor="#D14124" CssClass="gridheader" ForeColor="White" HorizontalAlign="Left" />
        </asp:GridView>

后面的代码就是这样

    protected void GridView1_RowCommand1(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Open")
        {

            int RowIndex = ((GridViewRow)((LinkButton)e.CommandSource).NamingContainer).RowIndex;
            string name = ((TextBox)GridView1.Rows[RowIndex].FindControl("txttartim")).Text;

            DropDownList bir = (DropDownList)GridView1.Rows[RowIndex].FindControl("birimlist");
            string birim = bir.SelectedItem.Value;
        
        }

    }

但我的问题是我无法获取所选行中的文本框和下拉列表的值。

字符串名称和 birim 为空。

试一试:

if (e.CommandName == "Open")
{
    GridViewRow selectedRow = ((GridViewRow)((LinkButton)e.CommandSource).NamingContainer);
    string name = ((TextBox)selectedRow.FindControl("txttartim")).Text;

    DropDownList bir = (DropDownList)selectedRow.FindControl("birimlist");
    string birim = bir.SelectedItem.Value;
}

好吧,我经常只是掉进飞机jane asp.net按钮,而我懒得使用GV内置的命令(例如command)。

但是,你有一个命令,所以你可以触发“行”命令。

并且“行命令”在所选索引触发之前触发,实际上在所选索引触发之前触发。

我注意到您传递了“ID”。这并不是真正必要的,因为 GV 具有所谓的 DataKeys 功能。该功能允许您获取行(数据库)PK id,但真正好的是您不必公开、显示甚至使用隐藏字段或其他任何东西来获取该数据密钥。 (这有几个原因 - 一个是你不必隐藏或推开,甚至使用命令参数来获取数据库 PK 行。另一个巨大的问题是你的数据库 pk 值永远不会暴露在客户端- 非常适合安全)。

好的,所以,确保你的行事件被触发,你应该能够使用它,首先是 Linkbutton 的标记:

        <asp:TemplateField  HeaderText="View" ItemStyle-HorizontalAlign="Center">
            <ItemTemplate>  
            <asp:LinkButton ID="cmdView" runat="server" Text="View" CommandName="Open" cssclass="btn btn-info" />
            </ItemTemplate>
        </asp:TemplateField>

请注意我如何不担心或传递“ID”。如前所述,datakeys 会处理这个问题,在 GV def 中,我们有这个:

 <asp:GridView ID="GVHotels" runat="server" class="table"
    AutoGenerateColumns="false" DataKeyNames="ID"
 bla bla bla

所以,现在我们的代码是这样的:

  protected void GVHotels_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        LinkButton lBtn = e.CommandSource as LinkButton;
        GridViewRow gRow = lBtn.NamingContainer as GridViewRow;

        int PKID = (int)GVHotels.DataKeys[gRow.RowIndex]["ID"];

        Debug.Print("Row index click = " + gRow.RowIndex);
        Debug.Print("Database PK id = " + PKID);

        // get combo box for this row
        DropDownList cbo = gRow.FindControl("cboRating") as DropDownList;
        Debug.Print("Combo box value = " + cbo.SelectedItem.Value);
        Debug.Print("Combo box Text  = " + cbo.SelectedItem.Text);

输出:

Row index click = 7
Database PK id = 68
Combo box value = 2
Combo box Text  = Good

因此,使用数据键 - 因此您不必到处添加额外的属性来获取 PK 行值。

事实上,真的,使用行命令往往更痛苦,你可以转储命令名称来触发按钮点击。真的很不错,那么您可以为 GV 中的每个按钮(或 link 按钮)获得一个单独的好命令“代码存根”。 (无需尝试将所有代码推入 row 命令,然后将一堆 if/then 或“case”语句推入给定命令的 运行 代码。

所以,我实际上建议你使用这个:

      <asp:TemplateField  HeaderText="View" ItemStyle-HorizontalAlign="Center">
            <ItemTemplate>  
            <asp:LinkButton ID="cmdView" runat="server" Text="View"
                OnClick="cmdView_Click1" cssclass="btn btn-info" />
            </ItemTemplate>
        </asp:TemplateField>

所以,我们所做的就是添加一个 plane jane good old 常规点击事件。它不会触发行命令,实际上不会触发 GV 的“选定索引已更改”,但在大多数情况下我不需要它们。所以,现在,如果你有 2 个或 5 个按钮,你只需将它们视为普通的平面按钮。 (只需在标记中输入 onclick,然后选择 intel-sense 弹出的“创建新事件”)。所以,现在我们的按钮代码是独立的,而不是行命令的一部分。我们的代码因此变成了这样:

    protected void cmdView_Click1(object sender, EventArgs e)
    {
        LinkButton lBtn = sender as LinkButton;
        GridViewRow gRow = lBtn.NamingContainer as GridViewRow;

        int PKID = (int)GVHotels.DataKeys[gRow.RowIndex]["ID"];

        Debug.Print("Row index click = " + gRow.RowIndex);
        Debug.Print("Database PK id = " + PKID);

        // get combo box for this row
        DropDownList cbo = gRow.FindControl("cboRating") as DropDownList;
        Debug.Print("Combo box value = " + cbo.SelectedItem.Value);
        Debug.Print("Combo box Text  = " + cbo.SelectedItem.Text);

    }

所以,我倾向于不理会行命令 - 最好只让飞机简点击事件。请注意命名容器的使用 - 但其余代码是相同的。我只会使用“commandName”来触发行事件,因为然后 gv 索引更改了事件触发 - 这对于突出显示整行很有用 - 但如果你不在乎,那么甚至不必理会 CommandName - 只需使用常规点击事件,如前所述,这甚至更好,因为每个按钮都会像其他任何按钮点击一样拥有 100% 自己的漂亮小代码存根。

所以我抓取了一个下拉列表,但您的代码可以这样写:

TextBox tBox = gRow.FindControl("txttartim") as TextBox;
debug.Print (tBox.Text);

我解决了问题

当我在 Page_load 部分编写代码时,它有效!它不再为空。

if (!Page.IsPostBack)
   {
      load();
      ..
   }