public class MyDataGrid : System.Web.UI.WebControls.DataGrid
{
  public override void RendControl(HtmlTextWriter writer)
  {
    base.RendControl(writer);
  }
}

解决方案 »

  1.   

    static private string RenderAnyControl(Control control)
    {
        StringBuilder ee = new StringBuilder();
        StringWriter we = new StringWriter(ee);
        HtmlTextWriter hw = new HtmlTextWriter(we);
        control.RenderControl(hw);
        return ee.ToString();
    }
      

  2.   

    再问一下,楼主是想看DataGrid.RenderControl的源码?
      

  3.   

    用工具——Reflector据说微软自己提供的,反编译.net程序集的工具很强btw,我劝你还是别看了,你会晕的
      

  4.   

    那我可不可以重载方法的同时,保留它的render ?
      

  5.   

    几乎没有一个控件自己重载了RenderControl,而全都是从Control.RenderControl继承来的方法。这就是面性对象的特点。人家设计asp.net体系的时候根本不用考虑DataGrid控件,DataGrid从Control继承,也就有了输出自己的专为DataGrid输出html的能力,而不需要写一行代码。
      

  6.   

    一般来讲,即使是派生的控件,RenderControl的逻辑我们是不需要干预的除非你对输出的html有特殊需求比如在DataGrid本来输出的html外面多加点内容……
      

  7.   

    比如在DataGrid本来输出的html外面多加点内容……     对啊,我就是有特殊要求啊
      

  8.   

    听 <sp1234> 讲的好深奥啊,什么时候能到你的程度啊,哎!
      

  9.   

    给你写了个例子,这几乎可以包括全部asp.net最主要控件处理的知识:创建两个文件default.aspx和uc1.ascx,我全都选择了取消“将后台代码单独写道文件中”选项。default.aspx文件是:<%@ Page Language="C#" %><%@ Register Src="Uc1.ascx" TagName="Uc1" TagPrefix="uc1" %>
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.IO" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server">
        
        Boolean SubControlsCreated = false;    private void CreateSubControls()
        {
            SubControlsCreated = true;
            this.PlaceHolder1.Controls.Clear();
            if (UCName != null)
            {
                Control uc = this.LoadControl(UCName);
                uc.ID = "aaa";
                this.PlaceHolder1.Controls.Add(uc);
            }
        }    private string UCName
        {
            get
            {
                return (string)ViewState["uc"];
            }
            set
            {
                if (string.IsNullOrEmpty(value)) ViewState.Remove("uc"); else ViewState["uc"] = value;
                SubControlsCreated = false;
            }
        }    protected void Button1_Click(object sender, EventArgs e)
        {
            UCName = this.TextBox1.Text + ".ascx";
        }    static private string RenderAnyControl(Control control)
        {
            StringBuilder ee = new StringBuilder();
            StringWriter we = new StringWriter(ee);
            HtmlTextWriter hw = new HtmlTextWriter(we);
            control.RenderControl(hw);
            return ee.ToString();
        }    public override void VerifyRenderingInServerForm(Control control)
        {
            //base.VerifyRenderingInServerForm(control);
        }    public override void RenderControl(HtmlTextWriter writer)
        {
            this.Label1.Text = Server.HtmlEncode(RenderAnyControl(this.PlaceHolder1));
            base.RenderControl(writer);
        }    protected void Page_Load(object sender, EventArgs e)
        {
            if (!SubControlsCreated)
                CreateSubControls();
        }
        protected void Page_PreRender(object sender, EventArgs e)
        {
            if (!SubControlsCreated)
                CreateSubControls();
        }</script><html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>无标题页</title>
    </head>
    <body style="font-size: smaller">
        <form id="form1" runat="server">
            请输入用户控件名字(不含后缀):<asp:TextBox ID="TextBox1" runat="server" Width="240px"></asp:TextBox><br />
            <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
            <hr />
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="装入子控件" />
            <br />
            html:
            <asp:Label ID="Label1" runat="server"></asp:Label>
            <hr />
            <asp:Button ID="Button2" runat="server" Text="什么也不做,只为测试动态装入的用户控件状态保持能力" />
        </form>
    </body>
    </html>
      

  10.   

    uc1.ascx文件是:<%@ Control Language="C#" ClassName="Uc1" %>
    <%@ Import Namespace="System.Data" %><script runat="server">    private DataTable ds
        {
            get
            {
                DataTable ret = new DataTable();
                ret.Columns.Add("name", typeof(string));
                DataRow dr;
                dr = ret.NewRow(); dr[0] = "张三"; ret.Rows.Add(dr);
                dr = ret.NewRow(); dr[0] = "皇帝"; ret.Rows.Add(dr);
                dr = ret.NewRow(); dr[0] = "王五"; ret.Rows.Add(dr);
                dr = ret.NewRow(); dr[0] = "马超"; ret.Rows.Add(dr);
                dr = ret.NewRow(); dr[0] = "关羽"; ret.Rows.Add(dr);
                return ret;
            }
        }    protected override void CreateChildControls()
        {
            base.CreateChildControls();
            if (this.DataGrid1.Items.Count == 0)
            {
                this.DataGrid1.DataSource = ds;
                this.DataGrid1.DataBind();
            } 
        }      protected void Button1_Click(object sender, EventArgs e)
        {
            string s = string.Empty;
            foreach (DataGridItem item in this.DataGrid1.Items)
            {
                if (((CheckBox)item.FindControl("CheckBox1")).Checked)
                    s += "[" + item.ItemIndex.ToString() + "]";
            }
            this.Label1.Text = s;
        }</script><asp:DataGrid ID="DataGrid1" runat="server" AutoGenerateColumns="False">
        <Columns>
            <asp:BoundColumn DataField="name" HeaderText="姓名" ReadOnly="True"></asp:BoundColumn>
            <asp:TemplateColumn HeaderText="选择">
                <ItemTemplate>
                    <asp:CheckBox ID="CheckBox1" runat="server" />
                </ItemTemplate>
            </asp:TemplateColumn>
        </Columns>
    </asp:DataGrid>
    <asp:Button ID="Button1" runat="server" Text="看看都选择了什么?" OnClick="Button1_Click" /><asp:Label
        ID="Label1" runat="server"></asp:Label>
      

  11.   

    把这两段代码拷贝到defaule.aspx文件和uc1.ascx文件上。代码中示例输出“任意控件”的html代码,并且我写了一个使用DataGrid的简单应用程序作为测试例子。
      

  12.   

    最后一个文件也可以稍微改一下完美一点:protected override void CreateChildControls()
    {
        base.CreateChildControls();
        this.DataGrid1.DataSource = ds;
        this.DataGrid1.DataBind();
    }只是原来多此一举判断了Items.Count==0,这一句并不必要。
      

  13.   

    如果你打算将RenderControl得到的html输出给ajax用来局部刷新客户端对象,DataGrid还是个太大的对象呢,往往输出item甚至cell就够了。好在item、cell其实都是Control,都可以用这里同样的方法输出。往往一个回调要局部刷新客户端document上很多个对象而不是一个,这些尽可能地小,例如仅仅是DataGrid中的一行、TreeView中的几个节点、Calendar中的一个日期Cell。自由地将多个控件的html打包成一个字符串或者几条javascript命令回调ajax客户端的小函数就行了。