重新创建动态创建的按钮

时间:2012-09-25 14:01:59

标签: c# asp.net dynamic-controls

我知道ASP.NET页面生命周期,但我很困惑。我这里有代码从数据库记录创建按钮。点击它们后,它们消失,没有触发代码。 :(我知道我必须在Page_Init中重新创建它们,但我不知道如何。请帮助!这是我的代码:

        try
        {
            con.Open();
            SqlDataReader myReader = null;
            SqlCommand myCom = new SqlCommand("select ID,client from tposClient where CardNo='" + cNo + "'", con);

            myReader = myCom.ExecuteReader();

            Panel panel1 = new Panel();
            panel1.Style["text-align"] = "Center";
            panel1.Style["background"] = "blue";
            div_login.Visible = false;

            while (myReader.Read())
            {
                string b = myReader["client"].ToString();
                string id = myReader["ID"].ToString();

                Button btn = new Button();
                btn.Text = b;
                btn.ID = id;
                btn.Style["width"] = "100px";
                btn.Click += new EventHandler(btn_Click);
                panel1.Controls.Add(btn);

                panel1.Controls.Add(new LiteralControl("<br />"));
                form1.Style.Add("display", "block");
                form1.Controls.Add(panel1);
            }
        }
        catch (Exception k)
        {
            Console.WriteLine(k.ToString());
        }
        finally
        {
            cmdselect.Dispose();
            if (con != null)
            {
                con.Close();
            }
        }

1 个答案:

答案 0 :(得分:1)

您应该将Button放在ListView控件内,该控件将重复您获得的每个结果。以这种方式使用按钮会更容易,而且您不必处理在每个Postback上重新创建控件。

创建一个ListView,里面有一个按钮

<asp:ListView ID="lv1" runat="server" OnItemDataBound="lv1_ItemDataBound">
    <ItemTemplate>
        <asp:Button ID="btn1" runat="server" Text="my Text />
    </ItemTemplate>
</asp:ListView>

在您进行数据访问后,创建一个Dictionary<string, string>来保存每个按钮的文本和ID,然后您可以使用它来绑定ListView

//Your data access code
Dictionary<string, string> buttonIdsWithText = new Dictionary<string, string>();
while(myReader.Read())
{
    string buttonText = myReader["client"].ToString();
    string buttonId = myReader["ID"].ToString();
    buttonIdsWithText.Add(buttonId, buttonText);
}
lv1.DataSource = buttonIdsWithText;
lv1.DataBind();

创建一个ItemDataBound事件处理程序,以便设置按钮文本

public void lv1_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType != ListViewItemType.DataItem)
    {
        return;
    }

    KeyValuePair<string, string> idWithText = 
        (KeyValuePair<string, string>)e.Item.DataItem;
    Button myButton = e.Item.FindControl("btn1") as Button;
    myButton.Text = idWithText.Value;
}

如果您需要将按钮ID专门设置为您从数据库获取的ID(并且您使用的是.NET 4),则可以将按钮的ClientIDMode设置为Static并设置ID到你想要的身份。