2010-09-02 18 views
1

我有一個包含一些數據源的頁面。我正在重新設計頁面本身,並希望在多個用戶控件中分割頁面的某些部分。帶ASPX頁面參數的數據源在用戶控件中移動

在我的代碼有一個具有以下PARAMS

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
    TypeName="DataSetTableAdapters.PhotosTableAdapter" 
    SelectMethod="GetPhotosForAlbum"> 
    <SelectParameters> 
     <asp:ControlParameter Name="albumID" ControlID="txtAlbumID" Type="Int32"/> 
    </SelectParameters> 
</asp:ObjectDataSource> 

這段代碼一個ObjectDataSource對象自動隱藏字段「txtAlbumId」綁定到數據源。在我的修訂中,這個數據源應該被移動到一個用戶控件。

處理這種情況的最佳方法是什麼?

問候, 洛倫佐

回答

1

您可以創建在用戶控件的屬性,露出財產上的隱藏字段,像這樣:

public int AlbumID 
{ 
    get { return Convert.ToInt32(txtAlbumID.Value); } 
    set { txtAlbumID.Value = value.ToString(); } 
} 

然後,您應該能夠連線對象數據源到用戶控制:

<asp:ControlParameter Name="albumID" ControlID="myUserControl" PropertyName="AlbumID" Type="Int32"/> 

編輯:

有幾種方法可以採用其他方式(即用戶控件中的數據源)。一種方法是可行的,但我覺得讓一些設計師的困惑,是從用戶控件作爲公共財產暴露參數採集:

public ParameterCollection SelectParameters 
{ 
    get { return ObjectDataSource1.SelectParameters; } 
} 

這樣做可以讓你從像這樣的頁面填寫參數採集:

<my:UserControl runat="server" ID="myUserControl"> 
    <SelectParameters> 
     <%-- ... --%> 
    </SelectParameters> 
</my:UserControl> 

如果您使用設計器,您的控件將始終顯示錯誤,但它的工作原理。 (注意,我已經在查詢字符串和會話參數中使用了這種方法,看看它是否能夠存在控制參數會很有趣。)

我認爲最簡單的方法是將您的ControlParameter對於普通的舊版本Parameter,並通過屬性公開默認值。

public int AlbumID 
{ 
    get { return Convert.ToInt32(ObjectDataSource1.Parameters[0].DefaultValue); } 
    set { ObjectDataSource1.Parameters[0].DefaultValue = value.ToString(); } 
} 

然後,您可以直接將數據綁定或分配給控件的AlbumID屬性,並期望將值轉發給參數。

+0

我對我的問題並不完全清楚抱歉。數據源應該在用戶控件中移動,但隱藏的字段將繼續保留在aspx頁面上。閱讀你的解決方案似乎相反。 – Lorenzo 2010-09-02 13:19:10

+0

@洛倫佐 - 對不起,誤會。我爲相反的方法增加了一些策略。 – kbrimington 2010-09-02 13:31:12

+0

太棒了!非常感謝!! – Lorenzo 2010-09-02 14:41:12

0

另一種選擇是以編程方式進行。

var cp = ObjectDataSource1.SelectParameters["albumID"] as ControlParameter; 

cp.ControlID = //Any one of a dozen ways to get this value into the control 
+0

是的。這肯定是一個解決方案。但是,在使用代碼以編程方式在用戶控件上設置該值之前,我想探討是否有聲明性代碼解決問題的解決方案。不管怎麼說,還是要謝謝你! – Lorenzo 2010-09-02 13:20:46

相關問題