在最近的一個項目中
用到在GridView模板列中添加有DropDownList控件
並開啟其AutoPostback屬性
當發生SelectedIndexChanged事件時
想同時獲取其所在的行號
從而獲取相應的行信息
由於DropDoweList與button不同
無法指定其CommandName
所以
也就沒辦法通過常規的方法捕獲所在行的索引
頗費了些周折
後來找到用NamingContainer屬性解決了問題
先來看看微軟對該屬性的解釋
獲取對服務器控件的命名容器的引用
此引用創建唯一的命名空間
以區分具有相同 Control
ID 屬性值的服務器控件
ASP
NET Web 應用程序的每一頁均包含控件的層次結構
此層次結構與控件是否生成用戶可見的 UI 無關
給定控件的命名容器是層次結構中該控件之上的父控件
此父控件實現 INamingContainer 接口
實現此接口的服務器控件為其子服務器控件的 ID 屬性值創建唯一的命名空間
當針對列表 Web 服務器控件(如 Repeater 和 DataList 服務器控件)進行數據綁定時
為服務器控件創建唯一的命名空間尤其重要
當數據源中的多個項創建服務器控件的多個實例
且該服務器控件是重復控件的子級 時
命名容器確保這些子控件的每個實例具有不沖突的 UniqueID 屬性值
頁的默認命名容器是請求該頁時生成的 Page 類的實例
可以使用此屬性確定特定服務器控件所在的命名容器
特別是最後一句話
下面是SelectedIndexChanged事件的代碼摘要
復制代碼 代碼如下:
DropDownList ddl = (DropDownList)sender;
GridViewRow gvr = (GridViewRow)ddl
NamingContainer;
int id = int
Parse(GridView
DataKeys[gvr
RowIndex][
]
ToString());
int num = int
Parse(ddl
Text);
第一句用來獲取觸發事件的DropDownList控件
第二句就利用該控件的NamingContainer屬性
獲取其容器
也就我想要的GridViewRow對象
有了這個
其它的都是常規用法
問題迎刃而解
From:http://tw.wingwit.com/Article/program/net/201311/14469.html