repeater 改变指定行的textbox

我用repeater控件显示数据,每行都有一个textbox和用于加减数量的asp:button按钮。效果如图,我想实现,点击,加或减,可以改变textbox内的值。但是... 我用repeater控件显示数据,每行都有一个textbox和用于加减数量的asp:button按钮。效果如图,我想实现,点击,加或减,可以改变textbox内的值。
但是我点击一次button之后,repeater内有几行记录就会加几或减几,而且只执行一次,之后再点击就没有效果了。

页面的代码如下:
<asp:Button ID="Minus" runat="server" CommandName='<%# Eval("PId") %>' OnCommand="Minus_OnCommand" CssClass="minus_button" />
<asp:TextBox ID="P_Quantity" runat="server" onkeyup="value=value.replace(/[^\d]/g,'')" style="width:38px; height:19px; line-height:19px; text-align:center; vertical-align:middle;" Text='<%# Eval("Quantity") %>' ></asp:TextBox>
<asp:Button ID="Plus" runat="server" CommandName='<%# Eval("PId") %>' OnCommand="Plus_OnCommand" CssClass="plus_button" />

事件代码如下:
protected void Minus_OnCommand(object sender, CommandEventArgs e)
{
foreach (RepeaterItem ri in this.ShoppingCartList.Items)
{
if (ri.ItemType != ListItemType.Header && ri.ItemType != ListItemType.Footer)
{
TextBox tb = ri.FindControl("P_Quantity") as TextBox;
tb.Text = Convert.ToString(Convert.ToInt32(tb.Text) - 1);
}
}
}

protected void Plus_OnCommand(object sender, CommandEventArgs e)
{
foreach (RepeaterItem ri in this.ShoppingCartList.Items)
{
if (ri.ItemType != ListItemType.Header && ri.ItemType != ListItemType.Footer)
{
TextBox tb = ri.FindControl("P_Quantity") as TextBox;
tb.Text = Convert.ToString(Convert.ToInt32(tb.Text) + 1);
}
}
}
repeater控件的ID为ShoppingCartList。textbox的ID为P_Quantity。这两个OnCommand事件只是实现了页面显示内容的变化,并没有更改数据库内的数据。

请高手帮忙解决一下。
展开
 我来答
百度网友d874f7292
2012-05-29 · 超过30用户采纳过TA的回答
知道答主
回答量:77
采纳率:0%
帮助的人:61.3万
展开全部
首先你应该看看Repeater都有哪些事件,你的这种写法有很多隐患,微软之所以封装控件,就是想让事件的执行在这个控件的作用域内执行,你的事件写的不符合规范,看看Repeater的ItemCommand事件,然后你就明白。
你可以在每个button添加CommandName,然后在ItemCommand的事件中获取var commandName = e.CommandName;这样就知道是哪个button被点击了,然后获取这行数据中的textBox, 如 var textBox = e.Item.FindControl("") as TextBox; 剩下的逻辑,你懂得,如果不懂自己看资料。 注:使用一个控件的时候,首先看看这个控件都有哪些属性和事件,然后再去行动,这样你才能少走弯路
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
leiyuan179zcs
2012-05-30 · TA获得超过100个赞
知道小有建树答主
回答量:275
采纳率:0%
帮助的人:159万
展开全部
<asp:Button runat="server" ID="Minus" CommandName="Edit_Minus" Text="-" />
<asp:TextBox runat="server" ID="P_Quantity" Text='<%# DataBinder.Eval(Container.DataItem, "ShipVia")%>'></asp:TextBox>
<asp:Button runat="server" ID="Plus" CommandName="Edit_Plus" Text="+" />
<input id="hdnPrdid" type="hidden" runat="server" name="hdnPrdid" value='<%# DataBinder.Eval(Container.DataItem, "OrderId")%>'/>

protected void rptList_ItemCommand(object source, RepeaterCommandEventArgs e)
{
if (e.CommandName == "Edit_Minus")
{
//
if (e.Item.ItemType != ListItemType.Header && e.Item.ItemType != ListItemType.Footer)
{
//获取标识,可以根据这个去修改数据库里面的数据
//string SaleId = ((HtmlInputHidden)e.Item.FindControl("hdnPrdid")).Value.Trim();

TextBox tb = (TextBox)e.Item.FindControl("P_Quantity");
int P_Quantity = int.Parse(tb.Text.Trim());
if (P_Quantity > 0)
{
tb.Text = (P_Quantity - 1).ToString();
//如果要更新数据库,继续在这后面操作
}
}
}
else if (e.CommandName == "Edit_Plus")
{
if (e.Item.ItemType != ListItemType.Header && e.Item.ItemType != ListItemType.Footer)
{
//获取标识,可以根据这个去修改数据库里面的数据
//string SaleId = ((HtmlInputHidden)e.Item.FindControl("hdnPrdid")).Value.Trim();

TextBox tb = (TextBox)e.Item.FindControl("P_Quantity");
int P_Quantity = int.Parse(tb.Text.Trim());

tb.Text = (P_Quantity + 1).ToString();
//如果要更新数据库,继续在这后面操作
} }
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
loeveol
2012-05-29 · TA获得超过541个赞
知道小有建树答主
回答量:120
采纳率:0%
帮助的人:138万
展开全部
我自己的做法是不使用OnCommand事件,而是直接对Button进行Click事件绑定,在事件里面通过对第一个参数(也就是触发事件的控件)转化为Control后取Parent然后FindControl("P_Quantity")就取得所在行的TextBox控件了,这时候强转后进行数据转换,并赋值。这样应该就没问题了。

你试试,有问题Hi我。

如果可以的话,你为每个单元格做UpdatePanel,做成ajax的效果会比较好。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式