2011-02-04 24 views
3

我有一些UserControl,我想每個都有一些基本的功能。下面是我的實現:.net - 如何創建實現接口的UserControl? LoadControl出錯

public interface IMyTabInterface 
{ 
    void LoadData(); 
} 

public partial class MyFirstTab : System.Web.UI.UserControl, IMyTabInterface 
{ 
    public void LoadData() 
    { 
     ... 
    } 

} 

然後,在另一個頁面的代碼背後,我嘗試:

protected void LoadFirstTab() 
    { 
     Control uControl1 = Page.LoadControl("/Controls/MyFirstTab.ascx"); 
     Control uControl2 = Page.LoadControl("/Controls/MySecondTab.ascx"); 

     // Want to do something like this, but don't get this far... : 
     var myFirstTab = (IMyTabInterface)uControl1; 
     var mySecondTab = (IMyTabInterface)uControl2; 

     myFirstTab.LoadData(); 
     mySecondTab.LoadData(); 

     Panel1.Controls.Add(myFirstTab); 
     Panel1.Controls.Add(mySecondTab); 
    } 

我懂得了,這是不正確的,但我本人對LoadControl得到一個錯誤( )行:

'MyFirstTab' 這裏不允許使用,因爲它不會擴展類 'System.Web.UI.UserControl'

即使該類明確地擴展了UserControl類。這裏發生了什麼?有一個更好的方法嗎?

回答

5

這將工作:

var myFirstTab = (IMyTabInterface)uControl1; 
var mySecondTab = (IMyTabInterface)uControl2; 

myFirstTab.LoadData(); 
mySecondTab.LoadData(); 

Panel1.Controls.Add((Control)myFirstTab); 
Panel1.Controls.Add((Control)mySecondTab); 

這是怎麼回事?

myFirstTabmySecondTab變量IMyTabInterface類型的,因爲這是你聲明他們作爲(這是什麼讓你打電話LoadData它們)。

但是,爲了向添加控件集合的一個項目,這些項目必須是Control(或從其繼承的項目) - 這是通過投射實現的。


另一種選擇:

var myFirstTab = (IMyTabInterface)uControl1; 
var mySecondTab = (IMyTabInterface)uControl2; 

myFirstTab.LoadData(); 
mySecondTab.LoadData(); 

Panel1.Controls.Add(uControl1); 
Panel1.Controls.Add(uControl2); 

在這裏,你使用你開始與原Control類型,所以沒必要投。

+1

嗨Oded,謝謝你的回覆。我完全犯了一個骷髏頭的錯誤,應該刪除這個問題 - 我已經改變了控件的命名空間,這就是爲什麼LoadControl()函數被打破。衛生署!在我放棄了所有的接口代碼之後才意識到這一點,只是爲了仍然得到相同的錯誤。 Woops。 – rusty 2011-02-04 18:31:32

相關問題