国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

讓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; }

}

}

}




發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁远县| 喀什市| 新民市| 古丈县| 抚顺县| 金沙县| 科技| 肇源县| 遵义市| 阿图什市| 泰兴市| 正定县| 西峡县| 平塘县| 读书| 鲁山县| 富锦市| 即墨市| 盱眙县| 乌拉特前旗| 佛坪县| 龙门县| 新和县| 海淀区| 湛江市| 陆河县| 溆浦县| 油尖旺区| 临海市| 涞源县| 罗江县| 临邑县| 阿图什市| 海丰县| 鄯善县| 林口县| 朝阳县| 瑞昌市| 苏尼特左旗| 昌平区| 仁寿县|