2012-04-04 83 views
2

私はかなりASP.NETに慣れていますが、これまでのところすべてのハードルを乗り越えることができました。しかし私は、私が作成したカスタムコントロールを含む、私が周りを回っているように見えることができない少し問題があります。ControlParameterはUserControlにあるコントロールを見つけることができません

コントロールは、JQueryを介してポップアップし、ユーザが結果セットをフィルタリングできるようにするためのコントロールを含む小さなウィジェットです。このポップアップのすべての要素が2つの特定のページに埋め込まれていて、それらのページはそれぞれ正常に動作していました。私は、ターゲットページのControl' directive and a登録」ディレ​​クティブでASCXファイルを使用して、これまで私が言うことができるように、カスタムコントロールを作成することを決めた、とそう正しく行われています:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="PopUp_TopicFilterControl.ascx.cs" Inherits="POD.PopUp_TopicFilterControl" %> 

そして

<%@ Register TagPrefix="popup" TagName="TopicFilterControl" Src="~/Controls/PopUp_TopicFilterControl.ascx" %> 

`main 'ページには、カスタムコントロール内の選択パラメータのコントロールを参照する必要があるオブジェクトデータソースがあります。ここでは、データソースです:

<asp:ObjectDataSource ID="TopicDataSource" runat="server" SelectMethod="GetRecentTopics" TypeName="POD.App_Objects.Topic"> 
    <SelectParameters> 
     <asp:Parameter DefaultValue="12" Name="select_limit" Type="Int32" /> 
     <asp:ControlParameter DefaultValue="" ControlID="TopicCategoryFilterList" Name="category" Type="String" /> 
     <asp:ControlParameter DefaultValue="" ControlID="TopicCreatorFilterList" Name="creator" Type="Int32" /> 
     <asp:ControlParameter DefaultValue="" ControlID="TopicDateAfterFilterText" Name="date_after" Type="String" /> 
     <asp:ControlParameter DefaultValue="" ControlID="TopicDateBeforeFilterText" Name="date_before" Type="String" /> 
    </SelectParameters> 
</asp:ObjectDataSource> 

そしてここでは、カスタムコントロールの本体である:

<asp:Panel id="TopicFilter_Panel" runat="server" CssClass="PopUp" ClientIDMode="Static" EnableTheming="False" EnableViewState="False" ViewStateMode="Disabled"> 
    <asp:Panel runat="server" CssClass="PopUp_Heading"> 
     <h1><a id="TopicFilter_Close" href="#">Close [X]</a></h1> 
    </asp:Panel> 
    <asp:Panel runat="server" CssClass="PopUp_Body"> 
     <asp:Table runat="server"> 
      <asp:TableRow runat="server"> 
       <asp:TableCell runat="server" HorizontalAlign="Right"> 
        By Category: 
       </asp:TableCell> 
       <asp:TableCell runat="server"> 
        <asp:DropDownList 
         ID="TopicCategoryFilterList" 
         runat="server" 
         DataSourceID="TopicCategoryDataSource" 
         DataTextField="value" 
         DataValueField="value" 
         AppendDataBoundItems="True" 
         AutoPostBack="False"> 
         <asp:ListItem Selected="True" Value="">&mdash; All &mdash;</asp:ListItem> 
        </asp:DropDownList> 
       </asp:TableCell> 
      </asp:TableRow> 
      <asp:TableRow runat="server"> 
       <asp:TableCell runat="server" HorizontalAlign="Right"> 
        By Author: 
       </asp:TableCell> 
       <asp:TableCell runat="server"> 
        <asp:DropDownList 
         ID="TopicCreatorFilterList" 
         runat="server" 
         DataSourceID="UserDataSource" 
         DataTextField="person_name_full" 
         DataValueField="user_id" 
         AppendDataBoundItems="True" 
         AutoPostBack="False"> 
         <asp:ListItem Selected="True" Value="">&mdash; All &mdash;</asp:ListItem> 
        </asp:DropDownList> 
       </asp:TableCell> 
      </asp:TableRow> 
      <asp:TableRow runat="server"> 
       <asp:TableCell runat="server" HorizontalAlign="Right"> 
        By Date (After): 
       </asp:TableCell> 
       <asp:TableCell runat="server"> 
        <asp:TextBox ID="TopicDateAfterFilterText" runat="server" /> 
        <ajaxToolkit:CalendarExtender ID="TopicDateAfterCalendarExtender" TargetControlID="TopicDateAfterFilterText" PopupPosition="BottomRight" runat="server" /> 
       </asp:TableCell> 
      </asp:TableRow> 
      <asp:TableRow runat="server"> 
       <asp:TableCell runat="server" HorizontalAlign="Right"> 
        By Date (Before): 
       </asp:TableCell> 
       <asp:TableCell runat="server"> 
        <asp:TextBox ID="TopicDateBeforeFilterText" runat="server" /> 
        <ajaxToolkit:CalendarExtender ID="TopicDateBeforeCalendarExtender" TargetControlID="TopicDateBeforeFilterText" PopupPosition="BottomRight" runat="server" /> 
       </asp:TableCell> 
      </asp:TableRow> 
      <asp:TableRow> 
       <asp:TableCell ColumnSpan="2" VerticalAlign="Bottom" HorizontalAlign="Center"> 
        <asp:Button runat="server" Text="Apply" CssClass="PopUp_Apply" /> 
       </asp:TableCell> 
      </asp:TableRow> 
     </asp:Table> 
    </asp:Panel> 
</asp:Panel> 

私は取得していますエラーは、オブジェクトデータソースは、私のカスタムコントロール内のコントロールを見ていないだけでということです(たとえば、 "ControlParameter 'category'にコントロール 'TopicCategoryFilterList'が見つかりませんでした")。明らかに、非常に単純な問題ですが、私の人生にとっては私はこの仕事をどうやって作るのかを考え出すことはできません。私はここでこれを扱ってきたに違いないと確信していますが、私は例を見つけることができません。

+0

まあ、大丈夫、わかった。明らかに(今私に)明らかに、フォームコントロールがカスタムコントロールの「内部」にあると、フォームコントロールはそのように「可視」にはなりません。それらはカスタムコントロール(duh)のプロパティになります。カスタムコントロールのコードビハインドページでは、データソースコントロールのパラメーターの後にあるコントロールの値を返すパブリックプロパティを作成する必要があります。 ControlParameterを変更して、ControlIDのカスタムコントロールの名前を尋ね、新しいプロパティを参照するPropertyName属性をコードの背後に追加するだけです。とった。 –

答えて

2

誰かが同じ難易度にぶつかり、自分の車輪を私のように激しく回転させて答えを見つけるために、この "問題"に対する私自身の解決策です。まず、カスタムコントロールのプロパティを返すためのコードのスニペットを次に示します。

public partial class PopUp_TopicFilterControl : System.Web.UI.UserControl 
{ 

    public string TopicCategory 
    { 
     get { return TopicCategoryFilterList.SelectedValue.ToString(); } 
    } 

} 

そして、ここでは、ObjectDataSourceの内部ControlParameterへの変更である:私がしなければならなかったしたすべての変更であることを

<asp:ControlParameter 
    DefaultValue="" 
    ControlID="TopicFilterSelection" 
    PropertyName="TopicCategory" 
    Name="category" 
    Type="String" /> 

注私はascx.csファイルに座って、このコードを持っていますControlIDを私のカスタムコントロールの名前に追加し、私がascx.csファイルで定義したプロパティを参照するPropertyName属性を追加します。

これだけです。あなたがそれを見るときは明白だが、それは私にかなりの時間を与えた。

+0

あなたが言ったように、これは一度それを見ると完璧な意味がありますが、そこに着くことはできません。素晴らしい解決策。 – Telavian

関連する問題