讓DataGrid擁有單擊回傳事件并帶回指定字段的值
2024-07-21 02:23:29
供稿:網(wǎng)友
注冊會員,創(chuàng)建你的web開發(fā)資料庫,讓datagrid擁有單擊回傳事件并帶回指定字段的值
在遇到主從表結(jié)構(gòu)的時候,我們經(jīng)常會有這樣的需求
那就是用一個datagrid來列出主表的信息,然后選中主表中的一條記錄根據(jù)主外健的值讓另外一個datagrid來顯示從表的信息。但是在datagrid的事件中滿足不了我們的需求,我們需要給datagrid添加一個onselectpostback事件,那么我們每選中一條主表記錄就會引發(fā)一次回傳,在事件里我們?nèi)〉街付ǖ臄?shù)據(jù)源的指定字段的值,綁定從表的信息
讓我們給我們得擴展datagrid取個很牛的開發(fā)代號:selectpostbackdatagrid
大體上我們需要擴展的內(nèi)容有:
1、 事件
public delegate void selectpostbackeventhandler(object sender, selectpostbackeventargs e);
public event selectpostbackeventhandler onselectpostback;
因為我們要傳回參數(shù),所以要自定義自己的委托事件,以便通過事件參數(shù)傳回我們指定字段的值
自定義事件參數(shù),我們需要行所引和傳回的字段值就可以了,當然你喜歡什么就傳回什么,只要你樂意。
public class selectpostbackeventargs : eventargs
{
private string n_value;
private int index;
internal selectpostbackeventargs(int index, string value)
{
this.index = index;
this.n_value = value;
}
public string value
{
get { return n_value; }
}
public int index
{
get { return index; }
}
}
2、 要傳回的數(shù)據(jù)源字段
public string selectpostbackdatafield
{
get
{
if (viewstate[base.uniqueid + "selectpostbackdatafield"] == null)
return null;
return viewstate[base.uniqueid + "selectpostbackdatafield"].tostring();
}
set { viewstate[base.uniqueid + "selectpostbackdatafield"] = value; }
}
public bool allowselectpostback
{
get
{
if (viewstate[base.uniqueid + "allowselectpostback"] == null)
return true;
return bool.parse(viewstate[base.uniqueid + "allowselectpostback"].tostring());
}
set { viewstate[base.uniqueid + "allowselectpostback"] = value; }
}
我們多個屬性allowselectpostback來設(shè)置需不需要回傳,或許把握們的這個擴展的datagrid當普通datagrid來用以未嘗不可阿!當然亦可以判斷有沒有事件在決定回不回傳也是不錯的。
之所以要保存到視圖狀態(tài)里面去,這是眾所周知的緣故我這里就不用多說了!
3、 讓datagrid擁有單擊回傳事件
似乎是一件非常奇妙的事情,讓我們來看看datagrid的在頁面結(jié)構(gòu)
在頁面上一個<tr></tr>對應的就是以行,那么添加單擊事件就是給<tr>添加onclick事件就可以了,或者添加雙擊事件,哈哈!只要你喜歡。而<tr>對應datagrid后臺的對象就是一個item,那么這個item就是datagrid的一行了,根據(jù)datagrid初始化item的順序,首先是頭,然后是身體,再就是角。哈哈!就是從上到下啦。因此item也有好幾種類型,我們只需要給數(shù)據(jù)行添加單擊事件就行了,別的都不需要管,也就是給item的itemtype是item,alternatingitem,selecteditem的行添加單擊事件就可以了
當然我們就在初始化行的時候做上面的事情,因此在構(gòu)造函數(shù)里我們加上初始化行的事件,然后再我們的事件函數(shù)里面干上面的活,注意一點是,我們要取到每一行我們指定要回傳的字段的值
databinder.eval(e.item.dataitem, selectpostbackdatafield).tostring()
這個方法取到指定字段在該行的值(這個方法在2.0中得到加強,非常好)
那么在單擊事件的回傳參數(shù)中我們就可以把這個之傳回來
構(gòu)造函數(shù)里發(fā)生的事情和事件函數(shù)內(nèi)要做的工作如下:
public selectpostbackdatagrid()
{
base.itemdatabound += new datagriditemeventhandler(selectpostbackdatagrid_itemdatabound);
}
private void selectpostbackdatagrid_itemdatabound(object sender, datagriditemeventargs e)
{
if (!allowselectpostback)
return;
if (e.item.itemtype == listitemtype.item || e.item.itemtype == listitemtype.alternatingitem || e.item.itemtype == listitemtype.selecteditem)
{
string argstring = e.item.itemindex.tostring();
if (selectpostbackdatafield != null)
argstring += "_" + databinder.eval(e.item.dataitem, selectpostbackdatafield).tostring();
e.item.attributes.add("onclick", page.getpostbackeventreference(this, argstring));
}
}
單擊事件終究還是放生了!哈哈!
那么從頁面?zhèn)骰貋淼膮?shù)我們怎么接受呢?這里需要嚴重注意的一點就是想要取到傳回來的參數(shù),最聰明方法就是實現(xiàn)ipostbackeventhandler接口,當然你也可以喜歡用別的辦法,可能你需要傳回來個多個復雜的數(shù)據(jù),只要你夠聰明,什么數(shù)據(jù)都可以穿來穿去,網(wǎng)絡(luò)的力量就是厲害,nero就是偉大的,我們也很偉大,因為我們有ipostbackeventhandler接口,就像是時空隧道一樣,不需要任何多余的東西。(哈哈!越扯越遠了)
實現(xiàn)這個接口之
public virtual void raisepostbackevent(string eventargument)
{
int index;
string fieldvalue = null;
if (selectpostbackdatafield != null)
{
index = int.parse(eventargument.substring(0, eventargument.indexof('_')));
int beginindex = eventargument.indexof('_') + 1;
int leng = eventargument.length - eventargument.indexof('_') - 1;
fieldvalue = eventargument.substring(beginindex, leng);
}
else
index = int.parse(eventargument);
this.selectedindex = index;
if (onselectpostback != null)
{
onselectpostback(this, new selectpostbackeventargs(index, fieldvalue));
}
}
這里面做的事情就是把頁面?zhèn)骰貋淼膮?shù)處理一下,實例化我們的自定義事件參數(shù),然后引發(fā)我們的事件,事情就結(jié)束了。當然,在用這個組件是添加的事件也就被引發(fā)了,也就取到我們自定義參數(shù)中的值了。
簡單的就是實現(xiàn)了單擊回傳的事件,當然可以干很多你喜歡干的事情,這里只是個示例
下面是完整的代碼,只要拷貝拿去編譯就可以了哦!
如果你喜歡,希望是 gpl 的支持者,為技術(shù)獻身
using system;
using system.web.ui.webcontrols;
using system.web.ui;
using system.componentmodel;
namespace hl
{
public class selectpostbackdatagrid : datagrid, ipostbackeventhandler
{
public selectpostbackdatagrid()
{
base.itemdatabound += new datagriditemeventhandler(selectpostbackdatagrid_itemdatabound);
}
public delegate void selectpostbackeventhandler(object sender, selectpostbackeventargs e);
public event selectpostbackeventhandler onselectpostback;
public virtual void raisepostbackevent(string eventargument)
{
int index;
string fieldvalue = null;
if (selectpostbackdatafield != null)
{
index = int.parse(eventargument.substring(0, eventargument.indexof('_')));
int beginindex = eventargument.indexof('_') + 1;
int leng = eventargument.length - eventargument.indexof('_') - 1;
fieldvalue = eventargument.substring(beginindex, leng);
}
else
index = int.parse(eventargument);
this.selectedindex = index;
if (onselectpostback != null)
{
onselectpostback(this, new selectpostbackeventargs(index, fieldvalue));
}
}
//attribute
public string selectpostbackdatafield
{
get
{
if (viewstate[base.uniqueid + "selectpostbackdatafield"] == null)
return null;
return viewstate[base.uniqueid + "selectpostbackdatafield"].tostring();
}
set { viewstate[base.uniqueid + "selectpostbackdatafield"] = value; }
}
public bool allowselectpostback
{
get
{
if (viewstate[base.uniqueid + "allowselectpostback"] == null)
return true;
return bool.parse(viewstate[base.uniqueid + "allowselectpostback"].tostring());
}
set { viewstate[base.uniqueid + "allowselectpostback"] = value; }
}
//private method
private void selectpostbackdatagrid_itemdatabound(object sender, datagriditemeventargs e)
{
if (!allowselectpostback)
return;
if (e.item.itemtype == listitemtype.item || e.item.itemtype == listitemtype.alternatingitem || e.item.itemtype == listitemtype.selecteditem)
{
string argstring = e.item.itemindex.tostring();
if (selectpostbackdatafield != null)
argstring += "_" + databinder.eval(e.item.dataitem, selectpostbackdatafield).tostring();
e.item.attributes.add("onclick", page.getpostbackeventreference(this, argstring));
}
}
}
public class selectpostbackeventargs : eventargs
{
private string n_value;
private int index;
internal selectpostbackeventargs(int index, string value)
{
this.index = index;
this.n_value = value;
}
public string value
{
get { return n_value; }
}
public int index
{
get { return index; }
}
}
}