如何获取 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();
..
}
我正在用 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();
..
}