我有一个网格视图,用户可以扩展它以填写表格。当我想获取文本框的值时,它为空。这是我添加红色箭头向您显示我希望通过按钮获得的信息的样子
这是我的前端
<asp:TemplateField>
<ItemTemplate>
<tr>
<td colspan="100%" style="background:#F5F5F5" >
<div id="div<%# Eval("componente_id") %>" style="overflow:auto; display:none; position: relative; left: 15px; overflow: auto">
<div class="ExpandTableHeader">
Cambiar la cantidad
</div>
<div class="body">
<label for="validationOfTypeID">Armario:</label>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:DropDownList ID="drCloset" AppendDataBoundItems="True" runat="server" Width="20%" Height="30px" AutoPostBack="true" OnSelectedIndexChanged = "OnClosetIndexChanged"></asp:DropDownList>
<br/>
<label for="validationOfTypeID" visible="false" >cajon</label> <br/>
<asp:DropDownList ID = "drDrawer" AutoPostBack="true" runat="server" Width="20%" Height="30px" >
</asp:DropDownList>
</ContentTemplate>
<Triggers>
<asp:AsyncPostbackTrigger ControlID="drCloset" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
<asp:Label ID="lblQuantity" runat="server" Text=""></asp:Label>
<label for="validationOfTypeID"></label>
<asp:DropDownList Height="30px" ID="drOperation" runat="server" AutoPostBack="true">
<asp:ListItem>+</asp:ListItem>
<asp:ListItem>-</asp:ListItem>
</asp:DropDownList>
<asp:TextBox width="50px" ID="txtChangeQuantity" runat="server" TextMode="Number" min="0" step="1" Value="0" ></asp:TextBox>
<asp:Label ID="lblTotal" runat="server" Text=""></asp:Label>
<br/>
</br>
<asp:Button ID="btnConfirmPurchases" runat="server" Text="Validar" AutoPostback="true" OnClick="confirm_purchases_Click" />
<asp:Button ID="btnHide2" runat="server" Text="Anular" AutoPostBack="True" />
</div>
<asp:DetailsView id="DetailsView1" DataKeyNames="componente_id" Runat="server" Width="300px" Font-Names="Calibri"/>
</td>
</tr>
</ItemTemplate>
</asp:TemplateField>
当用户按下按钮btnConfirmPurchases并使用调试器时,我发现txtChangeQuantity.Text为空
private static TextBox txtChangeQuantity;
protected void gvInventatario_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
txtChangeQuantity = (TextBox)e.Row.FindControl("txtChangeQuantity");
}
}
protected void confirm_purchases_Click(object sender, EventArgs e)
{
int resultingQuantity = 0;
if (drOperation.Text == "-")
{
resultingQuantity = quantity - int.Parse(txtChangeQuantity.Text);
}
else
{
resultingQuantity = quantity + int.Parse(txtChangeQuantity.Text);
}
if (resultingQuantity > 0)
{
}
}
这是我中某些人问到的页面加载量
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ViewState["sortOrder"] = "";
PopulateSorting("", "");
PopulateGridview(queryStrPopulateBasic);
gvInventario.DataSource = dt;
gvInventario.DataBind();
}
}
即使用户在文本框中写了一些内容,txtChangeQuantity.Text也为空。
更新
当我尝试在代码中添加中继器时,不再显示文本框,这里是新的aspx代码。
<asp:TemplateField>
<ItemTemplate>
<tr>
<td colspan="100%" style="background:#F5F5F5" >
<div id="div<%# Eval("componente_id") %>" style="overflow:auto; display:none; position: relative; left: 15px; overflow: auto">
<div class="ExpandTableHeader">
Cambiar la cantidad
</div>
<div class="body">
<label for="validationOfTypeID">Armario:</label>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:DropDownList ID="drCloset" AppendDataBoundItems="True" runat="server" Width="20%" Height="30px" AutoPostBack="true" OnSelectedIndexChanged = "OnClosetIndexChanged"></asp:DropDownList>
<br/>
<label for="validationOfTypeID" visible="false" >cajon</label> <br/> <%--WARGING DO NOT CHANGE NAME cajon WILL BREAK APPLICATION --%>
<asp:DropDownList ID = "drDrawer" AutoPostBack="true" runat="server" Width="20%" Height="30px" >
</asp:DropDownList>
</ContentTemplate>
<Triggers>
<asp:AsyncPostbackTrigger ControlID="drCloset" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
<asp:Repeater id="Repeater1" OnItemCommand="Repeater1_ItemCommand" runat="server">
<ItemTemplate>
<asp:Label ID="lblQuantity" runat="server" Text=""></asp:Label>
<label for="validationOfTypeID"></label>
<asp:DropDownList Height="30px" ID="drOperation" runat="server" AutoPostBack="true">
<asp:ListItem>+</asp:ListItem>
<asp:ListItem>-</asp:ListItem>
</asp:DropDownList>
<asp:TextBox width="50px" ID="txtChangeQuantity" runat="server" TextMode="Number" min="0" step="1" Value="0" ></asp:TextBox>
<asp:Label ID="lblTotal" runat="server" Text=""></asp:Label>
<br/>
</br>
<asp:Button ID="btnConfirmPurchases" runat="server" Text="Validar" AutoPostback="true" OnClick="confirm_purchases_Click" />
<asp:Button ID="btnHide2" runat="server" Text="Anular" AutoPostBack="True" />
</ItemTemplate>
</asp:Repeater>
</div>
<asp:DetailsView id="DetailsView1" DataKeyNames="componente_id" Runat="server" Width="300px" Font-Names="Calibri"/>
</td>
</tr>
</ItemTemplate>
</asp:TemplateField>
这是问题的图像
最佳答案
您的代码中有多个问题。我认为您具有静态声明的txtChangeQuantity
,因为当您单击按钮时,想要获取GridView中的txtChangeQuantity
值。
您正在GridView的txtChangeQuantity
事件中将GridView文本框的值分配给静态RowDataBound
。 GridView的每一行都会触发此事件。因此,最后您将获得静态txtChangeQuantity
中GridView中的last文本框的值。
而且,当您更改GridView文本框的值时,它将不会设置为静态txtChangeQuantity
。
同样,由于txtChangeQuantity
是静态的,并且没有在.aspx
页面中声明,因此单击按钮时,您将无法在后面的代码中获取其值。
属于其他模板控件(例如GridView和Repeater)的控件的事件无法正常运行。
我认为从您的代码中,您想要获取与GridView控件中的按钮相关联的文本框的值,以计算数量。您可以使用以下方法来做到这一点。
您需要使用GridView控件的RowCommand
事件。
https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.webcontrols.gridview.rowcommand?view=netframework-4.7.2
只要单击按钮控件GridView,就会触发RowCommand事件。
因此,您需要具有事件处理程序并分配给GridView的RowCommand。而且,您不需要按钮confirm_purchases_Click
的Click事件处理程序btnConfirmPurchases
。
<asp:GridView id="gvInventatario" OnRowCommand="gvInventatario_RowCommand" runat="server">
<ItemTemplate>
//All other code...
<asp:Button ID="btnConfirmPurchases" runat="server" Text="Validar" />
//All other code...
</ItemTemplate>
</asp:GridView>
RowCommand事件的事件处理程序如下所示。
protected void gvInventatario_RowCommand(Object Sender, GridViewCommandEventArgs e)
{
}
现在,每当您单击GridView中的任何按钮或链接时,都会触发此事件处理程序。在这里,您需要在按钮上找到相同级别的
txtChangeQuantity
,并获取其值以计算数量。您可以执行以下操作。事件处理程序的
GridViewCommandEventArgs e
用于确定从中单击按钮的GridViewRow,一旦确定了GridViewRow,就可以使用FindControl
方法从同一GridViewRow访问其他控件。How can we find the control in the row command of grid view?
protected void gvInventatario_RowCommand(Object Sender, GridViewCommandEventArgs e)
{
GridViewRow row = (GridViewRow)(((Control)e.CommandSource).NamingContainer);
TextBox quantityTextBox = row.FindControl("MyTextBoxId") as TextBox;
if(quantityTextBox != null)
{
int resultingQuantity = 0;
if (drOperation.Text == "-")
{
resultingQuantity = quantity - int.Parse(quantityTextBox.Text);
}
else
{
resultingQuantity = quantity + int.Parse(quantityTextBox.Text);
}
if (resultingQuantity > 0)
{
}
}
}
因此,您实际上不需要静态控制。您所需要做的就是正确处理GridView内部控件引发的事件。
关于c# - 单击按钮时,GridView内部的文本框值为空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55323459/