日期:2014-05-18  浏览次数:20479 次

Render事件中引发的逻辑错误
C# code

 protected override void Render(HtmlTextWriter writer)
        {
            //tb是自定义控件中的一个TextBox
            //lb是自定义控件中的一个Label
            //rev是一个验证控件
              Table table=new Table();
            table.CellPadding = 0;
            table.CellSpacing = 0;
            table.BorderWidth = 0;
            TableRow tableRow=new TableRow();
            TableCell tableCell1=new TableCell();
            tableCell1.Controls.Add(lb);
            tableRow.Controls.Add(tableCell1);

            TableCell tableCell2 = new TableCell();
            tableCell2.Controls.Add(tb);
            tableRow.Controls.Add(tableCell2);

            TableCell tableCell3 = new TableCell();
            tableCell2.Controls.Add(rev);
            tableRow.Controls.Add(tableCell3);

            table.Rows.Add(tableRow);
            table.RenderControl(writer);        }


我在一个自定义控件中重写了Render方法,导致出现以下错误
1.页面运行的时候会自动显示验证的errorMsg.
 2.页面提交后,不会保存TextBox的值.
这是为什么呢.?

------解决方案--------------------
保存状态需要重写SaveViewState和LoadViewState方法
------解决方案--------------------
你尝试把每一个控件单独去RenderControl(writer);
然后用RenderBeginTag去绘制表格.
你这个例子 夜战鹰的树上有说..
于一些比较有重要意义的子空间,都要调用控件自身的RenderControl方法,把控件输出到writer,确保逻辑正确
估计是你一次过write Table出来之后,导致里面的控件逻辑错误。
C# code

protected override void Render(HtmlTextWriter writer)
        {
            //tb是自定义控件中的一个TextBox
            //lb是自定义控件中的一个Label
            //rev是一个验证控件
            writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "0");
            writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "0");
            writer.AddAttribute(HtmlTextWriterAttribute.Border, "0");
            writer.RenderBeginTag(HtmlTextWriterTag.Table);
            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            this.lb.RenderControl(writer);
            writer.RenderEndTag();

            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            this.tb.RenderControl(writer);
            writer.RenderEndTag();

            if(!string.IsNullOrEmpty(this.ValidateExpression)&&!this.DesignMode)
            {
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                this.rev.RenderControl(writer);
                writer.RenderEndTag();
            }
            writer.RenderEndTag();
            writer.RenderEndTag();
        }