您的位置:首页 > 其它

关于Gridview自动生成列后,手动设定的模板列位置问题解决方案

2009-11-26 18:54 483 查看
关于在Gridview中使用AutoGenerateColumns="true"后模板列总是排在第一列的处理。

情况说明:有人也许会觉得好笑,直接在Gridview中编辑列然后设定好数据,最后再放模板列不就OK了,不过,这里要说明下,有时候不使我们偷懒不想设定,而是没有办法设定

在这里,返回的数据源是ArrayList(实体类还是动态生成的)也好,DataTable(存储过程多表查询平凑的数据)也罢,里面有多少列数据都是从法知道的,这种情况

肯定是不能手动在Gridview中指定BoundFiled了。

好了,废话不多说,这里没有好的处理方法,只是用js做了下障眼法而已。

分析:也曾想过在后台动态添加模板列,但是一直没有好的效果。最后干脆就在页面加载完成后处理,大家也都看过页面的html源代码,Gridview最后生成的是一个Table而已,那

我们就从Table下手,我们可以把第一列隐藏起来,然后在每一行后面添加一列,也就是把第一列copy到最后一列。下面就行动吧。

Code如下:

页面代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
<mce:script type="text/javascript" language="javascript"><!--

//由于加上MasterPage后Gridview生成的Table的ID会变化,这里加上一个方法获取生成的Table的ID
function getGridViewId()//获取Gridview的ID
{
var id;
var tb = document.getElementsByTagName("table");
for(var i=0;i<tb.length;i++)
{
if(tb[i].id.indexOf("GridView1")!=-1)
{
id = tb[i].id;
break;
}
}
return id;
}

//页面加载完成后隐藏第一列,同时在每一行增加一列
window.onload=function()
{
var tb = document.getElementById(getGridViewId());//获取Table
for(var i=0;i<tb.rows.length;i++)//循环Table每一行
{
if(tb.rows[i].cells.length<=1) break;//防止分页出现tb.rows[i].cells[0]为空情况,这里要看分页怎么做,然后做相应的修改
var firsttd = tb.rows[i].cells[0].cloneNode(true);//克隆第一列(模板列)
var newtd = tb.rows[i].insertCell();//插入一个新列
newtd.replaceNode(firsttd);//把新列用克隆的第一列置换掉
tb.rows[i].cells[0].style.display="none";//隐藏第一列
tb.rows[i].cells[tb.rows[i].cells.length-1].style.display="block";//设定新列显示(该代码是我项目的需要,和该功能没什么联系)
}
}

// --></mce:script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true" DataSourceID="ObjectDataSource1" Width="100%" OnRowCommand="GridView1_RowCommand">
<Columns>
<asp:TemplateField HeaderText="测试">
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" CommandName="kk" runat="server">LinkButton</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetRecordDS"
TypeName="TestDAL"></asp:ObjectDataSource>
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</div>
</form>
</body>
</html>


后台代码:

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "kk")
this.Label1.Text = "哈哈,测试成功啦!Oh,Yes!";
}


关于动态类的创建,在后期也会贴上来,同时还有一个js版的用户自定义显示列的动能(尚未测试)

如有更好的方法,欢迎批评指正,谢绝无聊跟帖与留言。

新修改:在window.onload=function()里

if(tb.rows[i].cells.length<=1) break;//防止分页出现tb.rows[i].cells[0]为空情况,这里要看分页怎么做,然后做相应的修改

获取GridView的Id 可以直接用<%= GridView1.ClientID %>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐