2009-05-19 16 views
2

我有一個DetailsView,我回傳 - 在裏面是一個UserControl。我在回發數據中遇到了一些困難。在DetailsView的TemplateField中查找用戶控件

舉個例子:

<asp:DetailsView ID="dvDetailsView" runat="Server" AutoGenerateRows="false"> 
<Fields> 
    <asp:TemplateField> 
    <ItemTemplate> 
     Some text here 
    </ItemTemplate> 
    <EditItemTemplate> 
     <uc:UserControl ID="ucUserControl" runat="server" /> 
    </EditItemTemplate> 
    <InsertItemTemplate> 
     <uc:UserControl ID="ucUserControl" runat="server" /> 
    </InsertItemTemplate> 
    </asp:TemplateField> 
</Fields> 
</asp:DetailsView> 

當我回傳,我會承擔我會做這樣的事情:

MyUserControlType ucUserControl = dvDetailsView.FindControl("ucUserControl") as MyUserControlType; 

但這覺得沒有什麼。事實上,我甚至無法通過在QuickWatch中漫步找到這個寶寶...

我該怎麼做才能找到這個東西?

編輯:原來我的usercontrol id正在改變 - 但爲什麼?我在插入和編輯模板上都有相同的ID,但評論說沒有任何區別。

回答

1

事實證明,用戶控件名稱已更改 - 我的usercontrol標記爲「ucUserControl」,它的名稱已更改爲通用名稱「ctl01」。

所以,做了一個dvSituation.Rows[0].Cells[0].FindControl("ctl01")找到了控件。

爲了找到這個ID,我只看了一下正在呈現的HTML元素,並從id中檢查了父項, 'ctl00_MainContent_dvDetailsView_ctl01_lblLabel',其中lblLabel出現在ucUserControl上。

行列是一個基於0的字段數索引,如果指定了headertemplate,那麼單元格索引將爲1。

編輯:OMG!有人(我真的不是我,我發誓)已經將ID身份隱藏在控制類中!

public partial class UserControl : BaseControl 
{ 
    public int Id; 
} 

這意味着,當ASP.Net正在生成的ID,它不能,而只是分配一個通用的ID(「ctl01」在這種情況下)的控制,而不是實際的名稱。

哇。

2

DataBind荷蘭國際集團控制後,你會使用:

dvDetailsView.Rows[0].Cells[0].FindControl("ucUserControl") 

並確保你只在編輯模式下這樣做,作爲控制只在EditItemTemplate存在。

+0

仍然無法找到這個控件,雖然我有另一個我可以找到的(它只是一個``控件。 – Khanzor 2009-05-19 08:31:46