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事件只是实现了页面显示内容的变化,并没有更改数据库内的数据。
请高手帮忙解决一下。 展开
但是我点击一次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事件只是实现了页面显示内容的变化,并没有更改数据库内的数据。
请高手帮忙解决一下。 展开
3个回答
展开全部
首先你应该看看Repeater都有哪些事件,你的这种写法有很多隐患,微软之所以封装控件,就是想让事件的执行在这个控件的作用域内执行,你的事件写的不符合规范,看看Repeater的ItemCommand事件,然后你就明白。
你可以在每个button添加CommandName,然后在ItemCommand的事件中获取var commandName = e.CommandName;这样就知道是哪个button被点击了,然后获取这行数据中的textBox, 如 var textBox = e.Item.FindControl("") as TextBox; 剩下的逻辑,你懂得,如果不懂自己看资料。 注:使用一个控件的时候,首先看看这个控件都有哪些属性和事件,然后再去行动,这样你才能少走弯路
你可以在每个button添加CommandName,然后在ItemCommand的事件中获取var commandName = e.CommandName;这样就知道是哪个button被点击了,然后获取这行数据中的textBox, 如 var textBox = e.Item.FindControl("") as TextBox; 剩下的逻辑,你懂得,如果不懂自己看资料。 注:使用一个控件的时候,首先看看这个控件都有哪些属性和事件,然后再去行动,这样你才能少走弯路
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
<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();
//如果要更新数据库,继续在这后面操作
} }
}
<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();
//如果要更新数据库,继续在这后面操作
} }
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我自己的做法是不使用OnCommand事件,而是直接对Button进行Click事件绑定,在事件里面通过对第一个参数(也就是触发事件的控件)转化为Control后取Parent然后FindControl("P_Quantity")就取得所在行的TextBox控件了,这时候强转后进行数据转换,并赋值。这样应该就没问题了。
你试试,有问题Hi我。
如果可以的话,你为每个单元格做UpdatePanel,做成ajax的效果会比较好。
你试试,有问题Hi我。
如果可以的话,你为每个单元格做UpdatePanel,做成ajax的效果会比较好。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询