动态添加控件和事件处理程序(asp.net c#)

时间:2018-03-29 18:04:53

标签: c# asp.net

我是一名计算机基础年级学生,我正在为大学的一个项目设计一个基本的电子商务网站,并遇到了一个问题,让我头疼我的桌子

所以......

我根据会话变量中的内容(类型字典 - 键是产品ID,值是数量),在篮子页面的Page_Load方法中使用asp.net控件动态创建购物篮。 / p>

我可以从浏览页面添加项目,这些项目具有更多动态添加的控件,基于用户放置在数据库的products表中的任何内容,这样可以正常工作。

我可以用所有细节填充篮子,但我正在努力争取一个' - '和' +'按钮改变篮子里的数量。

我可以指定事件处理程序来在一个类中运行一个方法,该类一次添加(或删除)1个项目,但我遇到的问题是如果我将我的代码放在Page_Load中,则函数可以工作但是在事件之前呈现控件处理程序触发(所以当字典更新时,它没有显示新值 - 你必须刷新或添加另一个,然后你总是落后1)

如果我将代码放在PreRender中,则事件处理程序不会触发。

这是我在ASP.NET中的第一个项目,所以如果我用我的方法咆哮错误的树,请放轻松。

任何想法或正确方向的推动都会感激不尽

非常感谢提前

编辑添加更多细节

//creating my button
Button tdQtyDownButton = new Button(); 
tdQtyDownButton.ID = "qtyDown"+ row["prod_id"]; tdQtyDownButton.Text = "-"; 
tdQtyDownButton.Click += delegate (object sender1, EventArgs e1) {
ShoppingBasket.AddItem((int)row["prod_id"]); };
tdQtyDown.Controls.Add(tdQtyDownButton);


//in seperate ShoppingBasket class file
public static void AddItem(int prod_id)
{
    if (HttpContext.Current.Session["basket"] != null)
    {
        if(!((Dictionary<int, int>)HttpContext.Current.Session["basket"]).ContainsKey(prod_id))
        {
            ((Dictionary<int, int>)HttpContext.Current.Session["basket"]).Add(prod_id, 1);
        }
        else
        {
            int currentQty = 0;
            ((Dictionary<int, int>)HttpContext.Current.Session["basket"]).TryGetValue(prod_id, out currentQty);
            ((Dictionary<int, int>)HttpContext.Current.Session["basket"]).Remove(prod_id);
            ((Dictionary<int, int>)HttpContext.Current.Session["basket"]).Add(prod_id, currentQty + 1);
        }

    }
    else
    {
        CreateBasket();
        AddItem( prod_id);         
    }
}

正如我所说,它有点作用 - 我认为它只是一个生命周期问题,可能需要一个全新的方法

2 个答案:

答案 0 :(得分:1)

对于Windows窗体应用程序

public partial class Form1 : Form
{
    int i = 1;
    int j = 1;
    int rbCount = 0;
    public Form1()
    {
        InitializeComponent();
    }

    private void buttonAddRadio_Click(object sender, EventArgs e)
    {
        RadioButton rb = new RadioButton();
        rb.Name = "Radio Button" + i.ToString();
        rb.Text = "Radio Button" + i;
        rb.Left = 8;
        rb.Top = 15 + (rbCount * 27);
        rb.AutoSize = true;
        rb.Click += new EventHandler(radio_click);
        groupBox1.Controls.Add(rb);
        i++;
        rbCount++;
    }

    void radio_click(object sender, EventArgs e)
    {
        MessageBox.Show(((RadioButton)sender).Text);
    }

    private void buttonAddCheck_Click(object sender, EventArgs e)
    {
        CheckBox cb = new CheckBox();
        cb.Name = "CheckBox" + j.ToString();
        cb.Text = "CheckBox" + j;
        cb.Left = 8;
        cb.Top = 15 + (rbCount * 27);
        cb.AutoSize = true;
        cb.Click += new EventHandler(checkbox_checked);
        groupBox1.Controls.Add(cb);
        j++;
        rbCount++;
    }

    void checkbox_checked(object sender, EventArgs e)
    {
        MessageBox.Show(((CheckBox)sender).Text);
    }
}

对于ASP.NET Web应用程序

string[] myArray = new string[] { "Alex", "Bob", "John", "Srinivas", "Zamal", "Rahul" }

            foreach (string item in myArray)
            {
                HyperLink myHyp = new HyperLink();
                myHyp.Text = Suspect;
                myHyp.NavigateUrl = "User Details.aspx?name=" + HttpUtility.UrlEncode(item));
                myPanel.Controls.Add(new LiteralControl("<ul>"));
                myPanel.Controls.Add(new LiteralControl("<li>"));
                myPanel.Controls.Add(hpSuspect);
                myPanel.Controls.Add(new LiteralControl("</li>"));
                myPanel.Controls.Add(new LiteralControl("</ul>"));
            }

N.B。 LiteralControl用于添加常规HTML控件。

答案 1 :(得分:0)

假设您想动态添加Button并处理它的点击事件:

Button button1 = new Button();
button1.Text = "dynamic button";
button1.Left = 10; button1.Top = 10; 
textBox1.Click += new EventHandler(btn_click);
this.Controls.Add(button1);

private void btn_click()
{
 }

更新:根据您的评论,您似乎想要刷新页面而不重新加载...为此,您最简单的方法是SignalR或者您可以使用UpdatePanel Control