[100分求救 ] Datagrid 修改表头之后,排序功能就不能用了 ??????????

live_7sky 2008-04-07 02:52:37
使用了 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>";
试过,生产代码 一样,但是 无法排序 。
...全文
233 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
live_7sky 2008-04-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 libraworm 的回复:]
sorry,写错,

LinkButton lbtn = (LinkButton)e.Item.Cells[0].Controls[0];
[/Quote]

谢谢,正解 ,午饭结贴。
libraworm 2008-04-08
  • 打赏
  • 举报
回复
sorry,写错,

LinkButton lbtn = (LinkButton)e.Item.Cells[0].Controls[0];
libraworm 2008-04-08
  • 打赏
  • 举报
回复
前提是允许DataGrid排序,生成的才是LinkButton
libraworm 2008-04-08
  • 打赏
  • 举报
回复
问题点数很多,于是来轻松赚分。

LinkButton lbtn = (LinkButton)e.Item.Cells[0];
lbtn.Text = "OrderID";
live_7sky 2008-04-07
  • 打赏
  • 举报
回复


呵呵,顶着有 分 ,我还有 400 多分。

以前都是只回帖 ,没有想到 回帖送可用分。今天突然一看,有这么多可用分,好啊。发一贴。
zhxingway 2008-04-07
  • 打赏
  • 举报
回复
好多代码呀,可惜我不是高手
帮不了你..呵呵
live_7sky 2008-04-07
  • 打赏
  • 举报
回复
解决 办法:

将 DataGrid1_ItemCreated 事件 换成 DataGrid1_ItemDataBound
live_7sky 2008-04-07
  • 打赏
  • 举报
回复
有数据的时候,

选择2,点击查询,先执行 Bind();在执行 DataGrid1_ItemCreated (if(t=="2")操作)

选择1,再次点击查询, 执行 DataGrid1_ItemCreated(),【重复了 第一次的 (if(t=="2")操作)】
然后再执行 Bind(),在执行 DataGrid1_ItemCreated (if(t=="1")操作)

如果2个表没有数据。
唯一不同的 是 【 】 里面的步骤 没有执行,

运行到 (if(t=="1")操作)报错了。

指定的参数已超出有效值的范围。参数名: index
live_7sky 2008-04-07
  • 打赏
  • 举报
回复
但是 如果 2个表 都有数据,就不会 出现问题。
live_7sky 2008-04-07
  • 打赏
  • 举报
回复
另外还有 一个问题:
<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个字段) 就会报错。说 索引超出范围 。

断点调试 也 没有发现问题。
live_7sky 2008-04-07
  • 打赏
  • 举报
回复
情况 我再描述一下:
一个 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 实现了 点击表头排序 功能,大家还有其他的办法吗 ?
叶子 2008-04-07
  • 打赏
  • 举报
回复
allowsort="true" 开启排序
chengqscjh 2008-04-07
  • 打赏
  • 举报
回复
allowsort="true" 你设置没有啊
live_7sky 2008-04-07
  • 打赏
  • 举报
回复
也是不行 ,主要是 因为我原来的表头 是 对象,
被我修改之后 e.Item.Cells[0].Text="OrderID"; 变成了纯文本,
所以一些 内置的方法属性 也消失了。

不过还是找到解决方法了,用 JS 给 DataGrid 排序。
xuan.ye 2008-04-07
  • 打赏
  • 举报
回复
加sorting事件 allowsort="true"

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧