使用了 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>";
试过,生产代码 一样,但是 无法排序 。
<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>";
试过,生产代码 一样,但是 无法排序 。
被我修改之后 e.Item.Cells[0].Text="OrderID"; 变成了纯文本,
所以一些 内置的方法属性 也消失了。不过还是找到解决方法了,用 JS 给 DataGrid 排序。
一个 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 实现了 点击表头排序 功能,大家还有其他的办法吗 ?
<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个字段) 就会报错。说 索引超出范围 。断点调试 也 没有发现问题。
然后再执行 Bind(),在执行 DataGrid1_ItemCreated (if(t=="1")操作)如果2个表没有数据。
唯一不同的 是 【 】 里面的步骤 没有执行,运行到 (if(t=="1")操作)报错了。指定的参数已超出有效值的范围。参数名: index
lbtn.Text = "OrderID";