2

私はポストバックしている DetailsView を持っています - そしてその中に UserControl があります。ポストバックデータでそれを見つけるのに苦労しています。

例として:

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

しかし、これは何も見つかりません。実際、クイックウォッチで歩き回っても、この赤ちゃんを見つけることさえできません...

これを見つけるにはどうすればいいですか??

編集:私のユーザーコントロールIDが変更されていたことがわかりました-しかし、なぜですか? 挿入テンプレートと編集テンプレートの両方で同じ ID を持っていますが、コメントアウトしても違いはありませんでした。

4

2 に答える 2

2

コントロールを ing した後 DataBind、次を使用します。

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

また、コントロールは にのみ存在するため、編集モードでのみこれを行っていることを確認してくださいEditItemTemplate

于 2009-05-19T07:39:30.457 に答える
1

結局のところ、ユーザー コントロール名が変更されました。「ucUserControl」というラベルの付いた私のユーザー コントロールは、その名前が一般的な名前「ctl01」に変更されました。

それで、dvSituation.Rows[0].Cells[0].FindControl("ctl01")コントロールを見つけました。

この ID を見つけるために、レンダリングされている HTML 要素を見て、id から親を確認ctl00_MainContent_dvDetailsView_ctl01_lblLabelしました。

行列は、フィールド数の 0 ベースのインデックスであり、ヘッダー テンプレートが指定されている場合、セル インデックスは 1 になります。

編集:OMG!誰か (本当は私ではありません) が、コントロール クラスの ID プロパティを隠していました!

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

これは、ASP.Net が ID を生成していたときに生成できず、実際の名前ではなく、一般的な ID (この場合は「ctl01」) をコントロールに割り当てただけだったことを意味します。

わお。

于 2009-05-20T00:22:42.880 に答える