为什么 textbox.Text 返回一个空字符串?
Why is textbox.Text returning an empty string?
首先让我先说明一下,我知道这个问题已经被问过很多次了。我已尝试实施我已阅读的所有内容,但尚未解决我的问题。
我在 GridView 中显示了一个购物车,我正在尝试使更新功能起作用。单击编辑(在有问题的行上)并更改文本框中的值,然后单击更新后,我总是返回一个空字符串。
我已经阅读了无数关于它是回发问题的帖子,但是我已经将我的 DataBind 方法封装在一个 if(!Page.IsPostBack){}
中,所以我认为这不是我的问题。
这些是我的代码文件中的相关方法:
protected void Page_Load(object sender, EventArgs e)
{
if (Session["thisCart"] == null)
{
Session["thisCart"] = new ShoppingCart();
}
thisCart = (ShoppingCart)Session["thisCart"];
if (!Page.IsPostBack)
{
FillData();
}
}
private void FillData()
{
gvShoppingCart.DataSource = thisCart.Items;
gvShoppingCart.DataBind();
if (thisCart.Items.Count == 0)
{
lblGrandTotal.Visible = false;
}
else
{
lblGrandTotal.Text = string.Format("Grand Total = {0,19:C}", thisCart.GrandTotal);
lblGrandTotal.Visible = true;
}
}
protected void gvShoppingCart_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
TextBox txtQuantity = (TextBox)gvShoppingCart.Rows[e.RowIndex].Cells[3].Controls[0];
int quantity = Int32.Parse(txtQuantity.Text);
thisCart.Update(e.RowIndex, quantity);
gvShoppingCart.EditIndex = -1;
FillData();
}
这是 aspx 文件:
<asp:GridView ID="gvShoppingCart" runat="server" AutoGenerateColumns="False" OnRowCancelingEdit="gvShoppingCart_RowCancelingEdit" OnRowDeleting="gvShoppingCart_RowDeleting" OnRowEditing="gvShoppingCart_RowEditing" OnRowUpdating="gvShoppingCart_RowUpdating" ClientIDMode="AutoID">
<Columns>
<asp:BoundField DataField="NAME" HeaderText="Product name" ReadOnly="True" />
<asp:ImageField DataImageUrlField="IMAGE" DataImageUrlFormatString="~\Images\{0}" HeaderText="Image" ReadOnly="True">
</asp:ImageField>
<asp:BoundField DataField="PRICE" HeaderText="Price" ReadOnly="True" />
<asp:BoundField DataField="QUANTITY" HeaderText="Quantity" />
<asp:TemplateField HeaderText="Total">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Double.Parse(Eval("PRICE").ToString()) * Int32.Parse(Eval("QUANTITY").ToString()) %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ShowHeader="False">
<EditItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="True" CommandName="Update" Text="Update"></asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel"></asp:LinkButton>
</EditItemTemplate>
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowDeleteButton="True" />
</Columns>
</asp:GridView>
我通常很擅长寻找答案,但这一次让我难住了。
点击更新后网站崩溃,因为 int quantity = Int32.Parse(txtQuantity.Text);
的返回值是“”,显然你不能从中解析一个整数。
至于可能与 "ASP.NET validation error message to change labels text." 重复的标签,我找不到任何指向答案的方向。
在 Page_PreInit
中调用 FillData()
。否则,当 ASP.Net 运行时去恢复网格的 ViewState 时,包括您的新文本框数据,还没有地方可以放置它。请记住,每个服务器事件都使用您页面的全新实例 class,并且必须从头开始重建 整个 页面。
因为我刚刚学习 ASP.net 和 C#,所以很难弄清楚。
当我能够在早期的作业中完成这项工作时,我没有使用母版页,但我使用的是这个项目。问题在于我在母版页中使用了 <form runat="server">
标记。由于每页只能有一个 <form runat="server">
标记,因此我的 GridView 没有包含在一个标记中。一旦我删除了母版页并在 GridView 周围添加了 <form runat="server">
包装器,一切都按预期工作。
首先让我先说明一下,我知道这个问题已经被问过很多次了。我已尝试实施我已阅读的所有内容,但尚未解决我的问题。
我在 GridView 中显示了一个购物车,我正在尝试使更新功能起作用。单击编辑(在有问题的行上)并更改文本框中的值,然后单击更新后,我总是返回一个空字符串。
我已经阅读了无数关于它是回发问题的帖子,但是我已经将我的 DataBind 方法封装在一个 if(!Page.IsPostBack){}
中,所以我认为这不是我的问题。
这些是我的代码文件中的相关方法:
protected void Page_Load(object sender, EventArgs e)
{
if (Session["thisCart"] == null)
{
Session["thisCart"] = new ShoppingCart();
}
thisCart = (ShoppingCart)Session["thisCart"];
if (!Page.IsPostBack)
{
FillData();
}
}
private void FillData()
{
gvShoppingCart.DataSource = thisCart.Items;
gvShoppingCart.DataBind();
if (thisCart.Items.Count == 0)
{
lblGrandTotal.Visible = false;
}
else
{
lblGrandTotal.Text = string.Format("Grand Total = {0,19:C}", thisCart.GrandTotal);
lblGrandTotal.Visible = true;
}
}
protected void gvShoppingCart_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
TextBox txtQuantity = (TextBox)gvShoppingCart.Rows[e.RowIndex].Cells[3].Controls[0];
int quantity = Int32.Parse(txtQuantity.Text);
thisCart.Update(e.RowIndex, quantity);
gvShoppingCart.EditIndex = -1;
FillData();
}
这是 aspx 文件:
<asp:GridView ID="gvShoppingCart" runat="server" AutoGenerateColumns="False" OnRowCancelingEdit="gvShoppingCart_RowCancelingEdit" OnRowDeleting="gvShoppingCart_RowDeleting" OnRowEditing="gvShoppingCart_RowEditing" OnRowUpdating="gvShoppingCart_RowUpdating" ClientIDMode="AutoID">
<Columns>
<asp:BoundField DataField="NAME" HeaderText="Product name" ReadOnly="True" />
<asp:ImageField DataImageUrlField="IMAGE" DataImageUrlFormatString="~\Images\{0}" HeaderText="Image" ReadOnly="True">
</asp:ImageField>
<asp:BoundField DataField="PRICE" HeaderText="Price" ReadOnly="True" />
<asp:BoundField DataField="QUANTITY" HeaderText="Quantity" />
<asp:TemplateField HeaderText="Total">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Double.Parse(Eval("PRICE").ToString()) * Int32.Parse(Eval("QUANTITY").ToString()) %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ShowHeader="False">
<EditItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="True" CommandName="Update" Text="Update"></asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel"></asp:LinkButton>
</EditItemTemplate>
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowDeleteButton="True" />
</Columns>
</asp:GridView>
我通常很擅长寻找答案,但这一次让我难住了。
点击更新后网站崩溃,因为 int quantity = Int32.Parse(txtQuantity.Text);
的返回值是“”,显然你不能从中解析一个整数。
至于可能与 "ASP.NET validation error message to change labels text." 重复的标签,我找不到任何指向答案的方向。
在 Page_PreInit
中调用 FillData()
。否则,当 ASP.Net 运行时去恢复网格的 ViewState 时,包括您的新文本框数据,还没有地方可以放置它。请记住,每个服务器事件都使用您页面的全新实例 class,并且必须从头开始重建 整个 页面。
因为我刚刚学习 ASP.net 和 C#,所以很难弄清楚。
当我能够在早期的作业中完成这项工作时,我没有使用母版页,但我使用的是这个项目。问题在于我在母版页中使用了 <form runat="server">
标记。由于每页只能有一个 <form runat="server">
标记,因此我的 GridView 没有包含在一个标记中。一旦我删除了母版页并在 GridView 周围添加了 <form runat="server">
包装器,一切都按预期工作。