zoukankan      html  css  js  c++  java
  • 点击按钮动态创建控件并获得值的原理及方法

    说到动态创建控件 就必须说下页面的生命周期了  上个简单的图

    说下可能遇到的问题  控件创建好了  但再点别的按钮时  就又消失了  因为没有保存状态

    还有的在Init查看Viewstate等 这些都是对页面生命周期理解的并不清楚~ 下面上demo说 

    第一步 先是动态创建控件

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <title></title>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
    <asp:HiddenField ID="HFControl" runat="server" />
    <asp:Button ID="BtnCreate" runat="server" Text="动态创建"
    onclick
    ="BtnCreate_Click" />
    <asp:Button ID="GetValue" runat="server" Text="获取选中的值"
    onclick
    ="GetValue_Click" />
    <asp:Label ID="lbl" runat="server" Text=""></asp:Label>
    <asp:Panel ID="PanelControl" runat="server">
    </asp:Panel>
    </div>
    </form>
    </body>
    </html>

     第二部 动态创建的code 这里说下  点击按钮动态创建的原理  点击按钮时  给HiddenField赋值 或者Viewstate赋值 然后在创建控件  这样当每次进入页面时 判断iddenField或者Viewstate是否有值 有值则显示那个动态创建的控件  这样就保存住里状态  当你再点其他控件时则不会丢失了 再次强调 不要写在!IsPostBack里面  那个是是否回发

    protected void Page_Load(object sender, EventArgs e)
    {
    //1.创建控件不要写在IsPostBack 2.Viewstate和控件的值 要在视图 装载完成后才有值 所以不要再Init等里面用
    if (!string.IsNullOrEmpty(HFControl.Value) && HFControl.Value=="flag")
    {
    CreateDropDownList();
    }
    if (!IsPostBack)//这个是判断是否为回发 如果把创建控件写在这里 控件当然会消失咯
    {

    }
    }


    /// <summary>
    /// 创建控件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void BtnCreate_Click(object sender, EventArgs e)
    {
    HFControl.Value
    = "flag";
    CreateDropDownList();
    }

    /// <summary>
    /// 动态创建DropDownList控件
    /// </summary>
    private void CreateDropDownList()
    {
    DropDownList ddl
    = new DropDownList();
    ddl.ID
    = "ddldynamic";
    ddl.Items.Add(
    new ListItem("1", "1"));
    ddl.Items.Add(
    new ListItem("2", "2"));
    ddl.Items.Add(
    new ListItem("3", "3"));
    ddl.Items.Add(
    new ListItem("4", "4"));
    ddl.AutoPostBack
    = true;
    ddl.SelectedIndexChanged
    += new EventHandler(ddl_SelectedIndexChanged);//给ddl添加事件
    PanelControl.Controls.Add(ddl);
    }

    第三部 则是点击控件   获得动态创建的控件选中的值 这里写了点击控件获得  还写了 自身回发事件获得

    /// <summary>
    /// 点击按钮 获得选中的ddl的值
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void GetValue_Click(object sender, EventArgs e)
    {
    DropDownList ddl
    = PanelControl.FindControl("ddldynamic") as DropDownList;
    if (ddl != null)
    {
    lbl.Text
    ="点击按钮得到的值为"+ddl.SelectedValue;
    }
    }

    /// <summary>
    /// 动态创建的DropDownList的事件 注意动态创建时 订阅了这个事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
    {
    DropDownList ddl
    = sender as DropDownList;
    if (ddl != null)
    {
    lbl.Text
    ="通过自身回发事件得到的值为"+ddl.SelectedValue;
    }
    }

    顺便说下  在页面里加上  Page指令里 加上  Trace="true"  可以看到很多细节  帮助很大

    好了~~ 这样常用的一些动态创建控件的操作就写完了 与大家分享下~  下一篇写下

    IsPostBack 的本质和原理~ 看到很多人说 在page里都要加上这个  看~ 今天的例子不就没加么~

    欢迎关注~

  • 相关阅读:
    HDU Problem 1811 Rank of Tetris【拓扑排序+并查集】
    POJ Problem 2367 Genealogical tree【拓扑排序】
    HDU Problem 2647 Reward【拓扑排序】
    HDU Problem 1285 确定比赛名次【拓扑排序】
    HDU Problem HDU Today 【最短路】
    HDU Problem 3665 Seaside【最短路】
    HDU Problem 一个人的旅行 【最短路dijkstra】
    HDU Problem 1596 find the safest road【最短路dijkstra】
    Beyond Compare文本合并进行内容替换要注意什么
    用这些工具都可以比较代码的差异
  • 原文地址:https://www.cnblogs.com/wlflovenet/p/Create.html
Copyright © 2011-2022 走看看