台灣最大程式設計社群網站
線上人數
943
 
會員總數:246713
討論主題:190131
歡迎您免費加入會員
討論區列表 >> ASP.NET >> GridView RowCommand 時 抓控制項
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
GridView RowCommand 時 抓控制項
價值 : 40 QP  點閱數:3807 回應數:8
樓主

789789789789
門外漢
0 14
361 17
發送站內信

工具:visual studio 2012
語言:C#

各位好

如果 GridView 某列有個控制項label1 如下程式碼 可以抓到該控制項

Label label = (Label)((GridViewRow)(((WebControl)e.CommandSource).NamingContainer)).FindControl("label1");

我的問題是
1. 從 e.CommandSource 一路轉換 WebControl,GridViewRow 最後才抓到控制項 Label
請問有沒有比較簡潔的寫法可以抓到該列某控制項?

有看過在 DataGrid 這樣寫的 所以想問是不是有較簡潔的寫法
Label label =(Label)e.Item.FindControl("label1")


2. 在aspx下 我是這樣寫
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Sno") %>'></asp:Label>
</ItemTemplate>

但我上面是寫 FindControl("label1")

我發現這樣還是抓的到那個label 也就是說FindControl()裡面的名稱不分大小寫

但C#不是應該要分大小寫的嗎?為什麼這裡可以不用分? 

謝謝











搜尋相關Tags的文章: [ GridView ] , [ RowCommand ] , [ control ] ,
本篇文章發表於2014-07-25 11:00
1樓
回應

Roson
檢舉此回應


問題二FindControl的大小寫..
大小寫不同應該是會抓不到
為什麼你抓的到就...不知
本篇文章回覆於2014-07-25 11:29
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
最有價值解答

Allen
捐贈 VP 給 Allen 檢舉此回應
1.
請試試(我沒親自試)
var label = ((Control)e.CommandSource).FindControl("label1");

2.
>>但C#不是應該要分大小寫的嗎?為什麼這裡可以不用分? 
這要看FindControl()這支method裡是如何寫的
本篇文章回覆於2014-07-25 17:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

789789789789
檢舉此回應
var label = ((Control)e.CommandSource).FindControl("label1");

上面這行的宣告方式 會讓label.Text出錯 錯誤訊息如下

'System.Web.UI.Control' 不包含 'Text' 的定義,也找不到擴充方法 'Text' 來接受型別 'System.Web.UI.Control' 的第一個引數 (您是否遺漏 using 指示詞或組件參考?)

所以我把他轉成這樣就可以了 

Label label = (Label)((Control)e.CommandSource).FindControl("label1");

謝謝


本篇文章回覆於2014-07-28 14:51
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

MIS2000 Lab
檢舉此回應
感謝發問&回答的朋友
這個問題很讚!很有幫助

從各位討論的關鍵字裡面,我找到微軟msdn的範例
(藉以瞭解 GridViewCommandEventArgs.CommandSource 屬性)

http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.gridviewcommandeventargs.commandsource(v=vs.110).aspx

學到很多,謝謝大家。
本篇文章回覆於2014-07-29 10:04
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

MIS2000 Lab
檢舉此回應
這是我改寫的範例,寫法差不多

GridView1_RowCommand事件裡面。

if (e.CommandName == "Hello")
{
Button BTN =(Button)e.CommandSource;
GridViewRow myRow = (GridViewRow)BTN.NamingContainer;

Label LB = (Label)GridView1.Rows[myRow.DataItemIndex].FindControl("Label1");
//按下按鈕之後,這一列的列數(index)

Response.Write(LB.Text);
}
本篇文章回覆於2014-07-29 10:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

MIS2000 Lab
檢舉此回應
7樓
回應

MIS2000 Lab
檢舉此回應
今天我又發現一點小差異
補一篇文章分享(謝謝各位的討論,讓我學到很多)

ButtonField 與 樣板裡面的Button,導致 e.CommandSource寫法不同
http://www.dotblogs.com.tw/mis2000lab/archive/2014/07/30/gridview_e-commandsource_rowcommand_error.aspx
本篇文章回覆於2014-07-30 11:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

Allen
捐贈 VP 給 Allen 檢舉此回應

var label = ((Control)e.CommandSource).FindControl("label1");
改成
var label = ((Control)e.CommandSource).FindControl("label1") as Label;
也是可以的
本篇文章回覆於2014-07-30 13:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.