将按钮放置在动态创建的字符串中
本文关键字:创建 字符串 动态 按钮 | 更新日期: 2023-09-27 18:12:42
我正试图从数据库中的产品创建一个产品页面。当我试图在代码中添加一个创建的按钮时,当我把它放在字符串中时,它只会显示"System.WebControls.button"。
现在我明白了为什么会发生这种情况,但我想不出如何添加真正的物理按钮的解决方案。
我的代码:
Button in_cart = new Button();
in_cart.Text = "Put in cart";
in_cart.Click += new EventHandler(send_to_cart);
in_cart.ID = PRODUCT_ID //Product ID is filled in by the ID from the database
//Webstring consists out of more lines but this is the line where it goes wrong
string webstring = in_cart;
productHolder.InnerHtml = webstring;
private void send_to_cart(object sender, EventArgs e)
{
Button clicked = (Button)sender;
int id = int.Parse(clicked.ID);
Response.Redirect(string.Format("startpage.aspx?ID={0}", id));
//Going to startpage just for the testing
}
这不是一个好的做事方式。最好避免从代码后面动态创建控件(这样做时必须特别注意(。为了这个答案,让我们避开它。
单个产品页面
在.aspx页面上定义按钮:
<asp:Button runat="server" id="in_cart" Text="Put in cart" OnClick="send_to_cart" />
然后在你的代码后面(.aspx.cs(
protected void Page_Load()
{
in_cart.CommandArgument=PRODUCT_ID; //assuming you load this from database
}
protected void send_to_cart(object sender, EventArgs e)
{
Response.Redirect(String.Format("startpage.aspx?ID={0}", in_cart.CommandArgument));
}
请注意,我使用按钮的命令参数来传递产品ID,因为按钮的ID是从代码后面引用按钮的方式,我们不能让它是动态的。此外,您的事件处理程序已受到保护,因此可以正确连接。此外,你的命名方案不是很好,应该更具描述性。以下是我的做法:
<asp:Button runat="server" id="AddToCartBtn" Text="Put in cart" OnClick="AddToCartBtn_Click" />
protected void Page_Load()
{
//assuming you load product from database, possibly using Entity Framework
AddToCartBtn.CommandArgument = product.ProductId;
}
protected void AddToCartBtn_Click(object sender, EventArgs e)
{
Response.Redirect(String.Format("startpage.aspx?ID={0}", AddToCartBtn.CommandArgument));
}
这更具可读性和描述性。
多个产品页面
该技术类似于将包含从数据库中提取的产品列表的页面。让我们使用Repeater,它可以数据绑定到产品列表,同时仍然让我们对HTML有很好的控制。
<asp:Repeater runat="server" id="ProductsRepeater">
<ItemTemplate>
Product Name: <%# ((Product)Container.DataItem).Name %><br />
Product Description: <%# ((Product)Container.DataItem).Description %><br />
<asp:Button runat="server" id="AddToCartBtn" OnClick="AddToCartBtn_Click" CommandArgument='<%# ((Product)Container.DataItem).ProductId() %>' />
<hr />
</ItemTemplate>
</asp:Repeater>
因此,中继器将为我们的对象创建HTML。让我们现在把它接线。请注意,我将数据绑定代码放在if语句中,以确保它不是回发,从而避免重新绑定数据。
protected void Page_Load()
{
if(!IsPostback)
{
List<Product> products=new List<Product>();
products.Add(new Product(){Name="Toothbrush", Description="Fights cavities", ProductId="tb1"});
products.Add(new Product(){Name="Vacuum Cleaner", Description="super vac!", ProductId="vac"});
products.Add(new Product(){Name="iPod", Description="Plays your music.", ProductId="ipod"});
ProductsRepeater.DataSource=products;
ProductsRepeater.DataBind();
}
}
protected void AddToCartBtn_Click(object sender, EventArgs e)
{
Button button=sender as Button;
string productid=button.CommandArgument;
Response.Redirect(String.Format("startpage.aspx?ID={0}", productid));
}
您需要一个Products类来处理这个示例。您可以将其放在代码后面,也可以将其放入App_code文件夹中的Products.cs中。
public class Product
{
public string Name {get; set;}
public string Description {get; set;}
public string ProductId {get; set;}
}
我为您构建了一组示例对象,但我假设您将从数据库中加载这些对象(如果您还没有相应的计划,请查看EntityFramework(。如果您不想使用实体框架,而只想使用纯ADO.NET,则可以始终绑定到DataTable。