使用DataGrid时,如果在aspx文件中定义模板列,并设置可排序,则可以触发SortCommand事件。但如果模板列是在.cs文件中动态创建的,并设置了列的SortExpression,虽然可以点击列,单却不可以响应SortCommand事件,有那个用过的指点一下。
.aspx代码:
<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False" AllowSorting="True" EnableViewState="True">
<Columns>
<asp:TemplateColumn HeaderText="ID" SortExpression="ID">
<ItemTemplate>
<asp:LinkButton id="ID" runat="server" CommandName="ID">
<%#DataBinder.Eval(Container, "DataItem.ID")%>
</asp:LinkButton>
</ItemTemplate>
         </asp:TemplateColumn>
</Columns>
</asp:DataGrid>
.cs代码
//添加模板列代码,在Page_Load函数中
TemplateColumn tm = new TemplateColumn();
tm.ItemTemplate = new TempCol_String("Name", "");//TempCol_String只是一个lable的模板列,lable显示"Name"的内容
tm.SortExpression = "Name";
tm.HeaderStyle.Wrap = true;
tm.HeaderStyle.Width =  new Unit(60);
tm.HeaderText = "Name";
tm.ItemStyle.Wrap = false;
dg.Columns.Add(tm);
//邦定数据
string strSql = "";
if(strSortExp != "")
strSql = "Select * from testdb order by " + strSortExp;//strSortExp排序的字段else
strSql = "Select * from testdb";
DataTable dt = ExecuteADOSQL(strSql);
DataGrid1.DataSource = dt;
DataGrid1.DataBind();
//以上代码运行后。如果点击ID列头则可响应dg_SortCommand,并正确排序,但点击Name列头则不响应dg_SortCommand。是否少了什么事件需要添加?

解决方案 »

  1.   

    if(strSortExp != "")
    strSql = "Select * from testdb order by " + strSortExp;//strSortExp排序的字段
    else
    strSql = "Select * from testdb";
      

  2.   

    可以試一試這個DataGridCommandEventHandler
      

  3.   

    是这样吗?
    ..............
    DataGrid1.SortCommand += new DataGridSortCommandEventHandler(DataGrid1_SortCommand);
    DataGrid1.DataSource = dt;
    DataGrid1.DataBind();
    也不行啊!
      

  4.   

    为什么要在程序里面添加模板列呢?
    放在itemdatabound里去.
      

  5.   

    参考
    http://singlepine.cnblogs.com/articles/266538.html模板列中也要加SortExpression="UserName",如<asp:TemplateColumn SortExpression="UserName" HeaderText="姓名">
    <ItemTemplate>
         <a href='form1.aspx?id=<%# DataBinder.Eval(Container.DataItem,"UserID") %>&name=<%# DataBinder.Eval(Container.DataItem,"UserName") %>' target="_blank">
            <%# DataBinder.Eval(Container.DataItem,"UserName") %>
          </a>
    </ItemTemplate>                                                                    </asp:TemplateColumn>
      

  6.   

    因为每个用户需要看的东西不同,不关心的列不想显示出来,用动态列就好实现这个要求。
    考虑到多个地方要用到,所以aspx文件中的datagrid不希望出现<asp:TemplateColumn SortExpression="UserName" HeaderText="姓名">,所有列均由程序生成。
    看来是没有办法了。