__doPostBack的一些应用

这段时间做了一个小项目,里面用到了很多HTML的控件,如:<button>,为了解决后台取值的问题研究了一下__doPostBack

总结一下心得:

一、 在后台判断哪个按钮点击了。

前台代码:

<button type="button" id="Button1" onclick="__doPostBack('btnReturn','1')">查询</button>

 注意onclick="__doPostBack('btnReturn','1')"

1、第一个参数表示按钮ID,第二参数随便写的,为的就是在后台确定按钮是否被点击了。

后台代码:

string controlName = Request.Params.Get( "__EVENTTARGET" );
string eventArgument = Request.Params.Get( "__EVENTARGUMENT" );

// 确定按钮事件
if( controlName == "btnConfirm" && eventArgument == "2" )
{
  btnConfirm_Click( sender, e );
}

// 查询按钮事件
if( controlName == "btnReturn" && eventArgument == "1" )
{
  btnReturn_Click( sender, e );
}

 

 2、从后台代码中可以看出__doPostBack的两个参数干什么用的。

详细说一下第二个参数,在这里第二参数的内容没有实际意义,就是为了在后台判断用的。看代码的判断条件用的是 &&,也就是同时满足这两个条件才执行里面的内容。

为什么要这样写?因为如果不指定eventArgument的内容,页面会保存controlName的值,比如在刷新页面的时候,刷新页面的时候controlName的值就是上一次触发 __doPostBack 的控件的ID。所以在这里写了这样的判断,必须两个条件同时满足,才可以视为“某某按钮”被点击了。

二、应用二,利用eventArgument 向后台传递参数。

前台JS代码:

__doPostBack('btnDelete',delStr);

 delStr就是向后台传递的一个字符串。

 后台代码:

string eventArgument = Request.Params.Get( "__EVENTARGUMENT" );
string[] delStr = eventArgument.Split( ',' );

 

三、DataGrid 行选中改变颜色

有些时候想让DataGrid 支持行选中事件,并且改变选中行的颜色。方法如下:

js代码1:

function selectRow( name )
{
    
// Get row that was clicked
    var oRow = window.event.srcElement.parentElement;

    
// Get rows in table
    var oRows = oRow.parentElement.parentElement.rows;
    
if ( oRows )
    {
        
var nRows = oRows.length;
        $(
'#maxRow').val( nRows+1 );

        
// Find the clicked row
        for ( var i=1; i<nRows+1; i++ )
        {
            
if ( oRows[i-1== oRow )
            {   
                
// Found - post an event to the server            
                $('#currentSelectRow').val( i+1 );     
                $(
'#gridFocusSet').val(1);
                
                
var num = 0;
                
if( ( i + 1 ) < 10 )
                {
                    num 
= '0' + ( i + 1 );
                }
                
else
                {
                    num 
= ( i + 1 );
                }
                
                
var ctlParam = name + '$ctl' + ( num ) + '$ctl00';
                __doPostBack( ctlParam, 
'' );  
                
return;
            }
        }
    }
    
return;
}
 

// grid onclick 事件

 

function drgControl_onclick()
{
    $('#currentScrollBarTop').val( $('#divGrid').scrollTop() );    
    selectRow( "drgControl" );
}
//重写__doPostBack
function __doPostBack(eventTarget, eventArgument)
{
    var theform = document.form1;

    if( theform.__EVENTTARGET != null )
    {
        theform.__EVENTTARGET.value = eventTarget;
    }

    if( theform.__EVENTARGUMENT != null )
    {
        theform.__EVENTARGUMENT.value = eventArgument;
    }
    theform.submit();
}

 


 name:就是grid控件的ID。

html 代码:

 

<script type="text/javascript" event="onclick" for="drgControl">drgControl_onclick()</script>

 

为grid添加一个选择按钮,让其可见为false:

 

<asp:ButtonColumn Visible="false" Text="选择" ButtonType="PushButton" CommandName="Select">
</asp:ButtonColumn>
 以上代码可以实现grid行选择事件。

 

原理:

把 asp:ButtonColumn Visible="false"  改为 “true”,然后把grid的页面运行起来,再查看页面源文件,会看到如下内容:

 

<input type="submit" name="drgControl$ctl02$ctl00" value="选择" />
<input type="submit" name="drgControl$ctl03$ctl00" value="选择" />
。。。。

 

。。。。

 

控件被解析了。

 

 

原理就是通过找控件名然后模拟 __doPostBack提交页面。

注意:name="drgControl$ctl02$ctl00" 是vs2005中的表现形式,2003中是name="drgControl:_ctl02:_ctl00"

将 “$”替换为 “:_”。

 


 

 

 

 

 

posted @ 2011-03-25 16:58  不羁  阅读(17526)  评论(2编辑  收藏  举报