动态添加table,动态添加控件

前段时间在WEBFORM中要实现产品的动态和产品的模块化功能,其中要在页面中实现产品的动态属性加载,这

就用到了动态添加table(table在这里主要是做布局),动态添加控件,但在实现过程也遇到了些小问题,在此把问题

说说,以及问题的解决方案,和大家一起分享。

 

实现动态添加table,动态添加控件分成两种行为操作:加载页面时创建加载、加载页面后创建加载

 

一。加载页面时创建加载

     什么意思呢?就是在Page_Load时就开始加载动态的控件或table,下面看看代码吧!~

 

          protected void Page_Load(object sender, EventArgs e)
          {

                     if (!IsPostBack)
                    {

 

                     }

            }

          //动态创建table,以及控件

         private void DynamicTableRow()

         {

           .........................

           //创建你要动态创建的控件或table

         }

对于这种行为操作是相对简单的了,不会出现视图加载失败的问题。

 

二。加载页面后创建加载

     举例说明吧,如我在页面上添加了一个DropDownList的控件,带入如下:

         <asp:DropDownList ID="DropDownList1" runat="server">
        <asp:ListItem>1</asp:ListItem>
        <asp:ListItem>5</asp:ListItem>
        <asp:ListItem>7</asp:ListItem>
        </asp:DropDownList>

      当选择1时要执行添加1个TextBox的控件

      当选择5时要执行添加5个TextBox的控件

      当选择7时要执行添加7个TextBox的控件

      且当点击页面上的“提交”按钮时要获取到这些创建的控件和输入的控件的值

     

      如果使用之前那种方法,你在页面上是可以看到动态加载了控件和table,但你在动态加载生成的TextBox控件中输入值,并

     点击“提交”时,发现找不到控件,且你查看页面的源文件的HTML代码页没有发现动态创建的控件,之所以这样,我上网查

    了相关的资料,好像是视图没有把动态创建的控件加载进去,我采用了一个方法去解决这个问题,就是重写了LoadViewState

     还原视图状态信息,代码如下:

         /// <summary>
    /// 重写LoadViewState,还原视图状态信息
    /// </summary>
    /// <param name="savedState"></param>
    protected override void LoadViewState(object savedState)
    {
        base.LoadViewState(savedState);
        int n = this.table.Rows.Count;
        if (ViewState["controsladded"] == null)
        {
            if (Session["ids"] != null)
            {
                DynamicTableRow(Session["ids"] as List<int>);
            }
        }
    }
      

    /// <summary>
    /// 动态控制页面table,加载一行的数据及控件,一行4列,2个属性,2个值
    /// </summary>
    private void DynamicTableRow(List<int> ids)
    {
        int num = 0;
        int nowidsCount = ids.Count;
        TableRow tr = new TableRow();
        foreach (int id in ids)
        {
            num = num + 1;
            TableHeaderCell celTh = new TableHeaderCell();
            celTh.Width = 130;

            Label thLabel = new Label();
            thLabel.ID = id.ToString() + "+label";
            thLabel.Text = NameTechnique(id);
            celTh.Controls.Add(thLabel);

            TableCell celTd = new TableCell();

            TextBox txtBox = new TextBox();
            txtBox.TextMode = TextBoxMode.MultiLine;
            txtBox.Width = 300;
            txtBox.ID = id.ToString();
            celTd.Controls.Add(txtBox);

            tr.Cells.Add(celTh);
            tr.Cells.Add(celTd);
            //控制一行显示的数据

            if (num == 2)
            {
                this.table.Rows.Add(tr);
                nowidsCount = nowidsCount - 2;
            }
            else
            {
                if (num == nowidsCount)
                {
                    if (num < 2)
                    {
                        for (int i = 1; i <= (2 - num); i++)
                        {
                            //补空列,一行必须满足有4列
                            TableHeaderCell celThNone = new TableHeaderCell();
                            celThNone.Width = 130;
                            TableCell celTd1None = new TableCell();

                            tr.Cells.Add(celThNone);
                            tr.Cells.Add(celTd1None);
                        }
                    }
                    this.table.Rows.Add(tr);
                }
            }
            if (num == 2)
            {
                tr = new TableRow();
                num = 0;
            }
        }
        ViewState["controlsadded"] = true;
    }

    以上是个人的简单总结,对这个页面的视图也没有什么研究,有个研究的朋友希望一起分享,感兴起的朋友可以一起讨论学习!~

转载于:https://www.cnblogs.com/wq3if2in/archive/2009/05/26/1490201.html

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Qt 中,可以通过自定义 QHeaderView 来实现在表头添加件的功能。具体步骤如下: 1. 定义一个继承自 QHeaderView 的子类,例如 MyHeaderView。 2. 在 MyHeaderView 中重写 paintSection() 函数,该函数会在绘制表头时被调用。 3. 在 paintSection() 函数中,首先调用父类的 paintSection() 函数,然后在需要添加件的位置进行件的绘制。 以下是一个添加 QPushButton 件的例子: ```cpp class MyHeaderView : public QHeaderView { public: MyHeaderView(Qt::Orientation orientation, QWidget *parent = nullptr) : QHeaderView(orientation, parent) { } protected: void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const override { // 调用父类的 paintSection() 函数 QHeaderView::paintSection(painter, rect, logicalIndex); // 在第一列表头的右侧绘制一个 QPushButton if (logicalIndex == 0) { QPushButton button("Button", const_cast<QWidget*>(static_cast<const QWidget*>(parent()))); QRect buttonRect = QRect(rect.right() - 20, rect.top() + 2, 18, 18); // 件的位置和大小 button.setGeometry(buttonRect); button.show(); } } }; ``` 使用时,将表格的水平表头和垂直表头分别设置为 MyHeaderView 类的实例即可: ```cpp QTableWidget table; table.setHorizontalHeader(new MyHeaderView(Qt::Horizontal, &table)); table.setVerticalHeader(new MyHeaderView(Qt::Vertical, &table)); ``` 注意:由于 QPushButton 件是在 paintSection() 函数中创建的,因此需要使用 const_cast 和 static_cast 将 parent 指针转换为非 const 类型。同时,由于 QPushButton 件是在 MyHeaderView 的生命周期内创建的,因此需要在 paintSection() 函数中设置其位置和大小,并在 paintSection() 函数之外手动调用其 show() 函数显示件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值