使用了 datagrid 的自带的排序功能。在 ItemCreated 事件里面将 表头修改之后,发现无法排序了。未修改表头的时候,生成的表头 代码
<td>
<a href="javascript:__doPostBack('DataGrid3$_ctl1$_ctl0','')">OrderID</a></td><td>
<a href="javascript:__doPostBack('DataGrid3$_ctl1$_ctl1','')">OrderDate</a></td><td>
<a href="javascript:__doPostBack('DataGrid3$_ctl1$_ctl2','')">ShipPostalCode</a></td><td>
<a href="javascript:__doPostBack('DataGrid3$_ctl1$_ctl3','')">ShipAddress</a></td>修改之后 生成的代码:
<td>OrderID</td><td>OrderDate</td><td>ShipPostalCode</td><td>ShipAddress</td>我 修改位置的代码:
    private void DataGrid3_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
        {
            if(e.Item.ItemType==ListItemType.Header)
            {               
                e.Item.Cells[0].Text="OrderID";
                e.Item.Cells[1].Text="OrderDate";
                e.Item.Cells[2].Text="ShipPostalCode";
                e.Item.Cells[3].Text="ShipAddress";                   
               
            }           
        }
这个位置 如何写,才能 生成 "javascript:__doPostBack 的代码 ?
我用   e.Item.Cells[0].Text="<a href=\"javascript:__doPostBack('DataGrid3$_ctl1$_ctl0','')\">OrderID</a>";
试过,生产代码 一样,但是 无法排序 。

解决方案 »

  1.   

    加sorting事件 allowsort="true"
      

  2.   

    也是不行 ,主要是 因为我原来的表头 是 对象,
    被我修改之后 e.Item.Cells[0].Text="OrderID";  变成了纯文本,
         所以一些 内置的方法属性 也消失了。不过还是找到解决方法了,用 JS 给 DataGrid 排序。
      

  3.   

    allowsort="true" 你设置没有啊
      

  4.   

     情况 我再描述一下:
    一个 datagrid, 自动生成列,并开启 分页 .排序 功能 : 经测试一切 正确。根据下拉列表框 中选择的表的名字,查询不同的表,绑定到 datagird ,
    表不同,表头 也不同
     ,所以,我在 ItemCreated 事件里面 自定义表头 
     private void DataGrid3_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
            {
                if(e.Item.ItemType==ListItemType.Header)
                {    
                    // 根据一定的条件 去设置表头 。           
                    e.Item.Cells[0].Text="****";
                    e.Item.Cells[1].Text="*****";
                    e.Item.Cells[2].Text="****";
                    e.Item.Cells[3].Text="****";                   
                   
                }           
            } 
    自定义表头 之后,表头 无法点击,变成了纯文本了。无法排序了。 解决办法 :
    目前用 sorttable.js 实现了 点击表头排序 功能,大家还有其他的办法吗 ? 
      

  5.   

     另外还有 一个问题:
    <form id="Form1" method="post" runat="server">
    <asp:dropdownlist id="DropDownList1" runat="server" Width="136px">
    <asp:ListItem Value="-1" Selected="True">请选择</asp:ListItem>
    <asp:ListItem Value="1">订单表</asp:ListItem>
    <asp:ListItem Value="2">员工信息表</asp:ListItem>
    <asp:ListItem Value="3">测试表</asp:ListItem>
    </asp:dropdownlist><asp:button id="Button1" runat="server" Text="查询"></asp:button><asp:datagrid id="DataGrid1" runat="server" Width="100%" PageSize="5">
    <PagerStyle Mode="NumericPages"></PagerStyle>
    </asp:datagrid>
    </form>
    ============================================================================================
    private void Button1_Click(object sender, System.EventArgs e)
    {
    Bind();
    }
    private void Bind()
    {
    string sql1="select a,b,c,d from test";
    string sql2="select a,b,c from test2";
    string ConnStr="Server=.;Database=Northwind;uid=sa;pwd=sa";
    DataSet ds=null;
    if(this.DropDownList1.SelectedValue=="1")
    {
    ds= SqlHelper.ExecuteDataset(ConnStr,CommandType.Text,sql1);
    Session["ls"]="1";

    }
    else if(this.DropDownList1.SelectedValue=="2")
    {
    ds=SqlHelper.ExecuteDataset(ConnStr,CommandType.Text,sql2);
    Session["ls"]="2";
    }
    else
    {
    Session["ls"]="3";
    }
    this.DataGrid1.DataSource=ds;
    this.DataGrid1.DataBind();

    }=
    private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
    if(e.Item.ItemType==ListItemType.Header)
    {
    if(Session["ls"]!=null)
    {
    string t=Session["ls"].ToString();
    if(t=="1")
    {
    e.Item.Cells[0].Text="订单编号";
    e.Item.Cells[1].Text="订购日期";
    e.Item.Cells[2].Text="邮政编号";
    e.Item.Cells[3].Text="送货地址";
    }
    else if(t=="2")
    {
    e.Item.Cells[0].Text="员工编号";
    e.Item.Cells[1].Text="生日";
    e.Item.Cells[2].Text="CC";
    }
    else
    { }
    }
    }
    }
    自定义 表头,当 2个表 有数据的时候 一切正常 ,如果没有数据的时候, 选择 下拉列表框 ,点击查询的时候, 就会出现问题。
     比如说,我先查看的 员工信息表 ,只有 3个字段, 我在 查看 订单表(4个字段) 就会报错。说 索引超出范围 。断点调试 也 没有发现问题。
      

  6.   

    有数据的时候, 选择2,点击查询,先执行 Bind();在执行 DataGrid1_ItemCreated (if(t=="2")操作)选择1,再次点击查询, 执行  DataGrid1_ItemCreated(),【重复了 第一次的 (if(t=="2")操作)】
     然后再执行 Bind(),在执行 DataGrid1_ItemCreated (if(t=="1")操作)如果2个表没有数据。
     唯一不同的 是  【 】 里面的步骤 没有执行,运行到 (if(t=="1")操作)报错了。指定的参数已超出有效值的范围。参数名: index 
      

  7.   

    解决 办法: 将  DataGrid1_ItemCreated 事件 换成  DataGrid1_ItemDataBound
      

  8.   

    问题点数很多,于是来轻松赚分。LinkButton lbtn = (LinkButton)e.Item.Cells[0]; 
    lbtn.Text = "OrderID"; 
      

  9.   

    前提是允许DataGrid排序,生成的才是LinkButton
      

  10.   

    sorry,写错,LinkButton lbtn = (LinkButton)e.Item.Cells[0].Controls[0];