我正在使用 c# asp.net 开发一个项目。
我创建了一个 gridview 并将其连接到数据库。我的代码是这样的;
<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;
}
}
但我的问题是我无法获取所选行中文本框和下拉列表的值。
字符串 name 和 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;
}
我解决了问题。
当我在 Page_load 部分编写代码时,它起作用了!它不再为空。
if (!Page.IsPostBack)
{
load();
..
}
我经常只是放入一个普通的Jane asp.net按钮,并且我不费心使用GV内置命令(例如command)。
但是,您有一个命令,因此您可以触发“row”命令。
“行命令”在选定索引触发之前触发,实际上在选定索引触发之前触发。
我注意到您传递了“ID”。这并不是真正必要的,因为 GV 具有所谓的 DataKeys 功能。该功能允许您获取行(数据库)PK id,但真正好的一点是您不必公开、显示甚至使用隐藏字段或其他任何内容来获取该数据密钥。 (这很好,有几个原因 - 一个是你不必隐藏命令参数来获取数据库 PK 行。另一个巨大的问题是你的数据库 pk 值永远不会暴露在客户端 - 这对于安全性来说非常好)。
因此,请确保您的行事件被触发,并且您应该能够使用它,首先是链接按钮的标记:
<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
因此,使用 datakeys - 因此您不必到处输入额外的属性来获取 PK 行值。
事实上,使用行命令通常更痛苦,您可以转储命令名称来触发该按钮单击。真的很好的是,您可以为 GV 中的每个按钮(或链接按钮)获得一个单独的好命令“代码存根”。 (无需尝试将所有代码推入 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>
所以,我们所做的就是添加一个常规的点击事件。它不会触发行命令,实际上不会触发 GV 的“选定索引已更改”,但在大多数情况下我不需要它们。所以,现在,如果您有 2 个或 5 个按钮,您只需将它们视为常规按钮即可。 (只需在标记中输入 onclick,然后选择 IntelliSense 弹出的“创建新事件”)。因此,现在我们的按钮代码是单独的,而不是行命令的一部分。我们的代码就变成了这样:
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);