js全局变量的应用-GridView单击行的任意列会自动选中此行
这文章为转载。。。。。
起因是这样的,我做了一个控件,这里面
包含了一个gridview控件,上面有选择按钮,但是我想不显示选择列点击行上的任意处都执行"选择"任务,在一般的页面里加下面代码就可以了
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Header)
{
//e.Row.Cells[5].Visible = false;
//当鼠标停留时更改背景色
e.Row.Attributes.Add("onmouseover", "c=this.style.backgroundColor;this.style.backgroundColor='#ffffe7'");
//当鼠标移开时还原背景色
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=c");
//单击行的任意列会自动选中此行
e.Row.Attributes.Add("onclick", "__doPostBack('GridView1','Select$" e.Row.RowIndex "')");
}
}
但是注意,我是做的用户控件,当控件被托拽到别的页面上的时候,控件里面用的服务器控件都会加一个本用户控件名子的前缀,这就出现问题了在
"e.Row.Attributes.Add("onclick", "__doPostBack('GridView1','Select$" e.Row.RowIndex "')");"中在新页面上的'GridView1'存在,但是叫做另一个名子了,就是比如控件叫"WebUserControl",那么在新的引用页里他就叫"WebUserControl1",原来的GridView1就叫做WebUserControl1_GridView1了,这时候,里面的选择按钮列增加onclick的事件的行就叫"WebUserControl1$GridView1"了,也就是说这样写才有效"e.Row.Attributes.Add("onclick", "__doPostBack('WebUserControl1$GridView1','Select$" e.Row.RowIndex "')");",但是问题是如果这样写死的话,如果是页面上引用两个这样的控件,就会出问题了,第二个控件叫做WebUserControl2,但是它上面的事件已经被固定了,所以第二个会不起做用,也就是说页里只能用一个控件,那做这个控件就没有意义了,我解决的办法是,引用了前台javascript的全局变量
<script type="text/javascript">
//这里如果div变成服务器端运行,那么在页里设置的样式都失效,只能在控件本上上设置,js程序在其它控件被调用后会失效
var ctrlid="null";
function tbMachineShwo(){//这个函数在控件里用一个按钮触发
ctrlid=event.srcElement.id.substr(0,15) "$GridView1";//意思就是取出这个控件在页里的id
}
</script>
然后在后台页里这样写
e.Row.Attributes.Add("onclick", "__doPostBack(ctrlid,'Select$" e.Row.RowIndex "')");
这样就能在点击任意处都加上这个onclick事件了.