2013-01-17 58 views
0

使用我有一個頁面上定義2個用戶控件:決定用戶在運行時控制

<%@ Register Src="Foo.ascx" TagName="FooControl" TagPrefix="acme" %> 
<%@ Register Src="Bar.ascx" TagName="BarControl" TagPrefix="acme" %> 
. 
. 
. 
<acme:FooControl ID="myFoo" runat="server" Visible="false" /> 
<acme:BarControl ID="myBar" runat="server" Visible="false" /> 

在運行時,我想設置用戶控件的屬性中的一個在頁面的代碼的各個位置。例如:

protected void SomeMethod() 
{ 
    if (isSomeCondition) 
    { 
     myFoo.Visible = true;   
    } 
    else 
    { 
     myBar.Visible = true; 
    } 

    // ... 

    if (somethingElse) 
    { 
     if (isSomeCondition) 
     { 
      myFoo.Prop1 = 123;   
     } 
     else 
     { 
      myBar.Prop1 = 123; 
     } 
    } 

    // ... 
} 

我知道我可以從一個通用接口繼承2個用戶控件,但有沒有另一種(可能更好)的方式?

+1

http://codereview.stackexchange.com/ –

+1

而且,不,我還沒有發現沒有更好的方式比使用通用接口。據我記憶,第二個最好的選擇是你正在使用的那個。 –

+1

我想你可以使用反射設置屬性,但我真的不會推薦這麼做。你會失去類型安全。通用界面就是我想要的方式。你不喜歡的解決方案是什麼? –

回答

1

編輯:我剛剛意識到我的答案大部分已經被同一問題的意見所覆蓋。對有意見的人道歉,我並不是故意「偷」你的內容...... :)

不,我能想到不同達到相同結果的方法(通過反射調用屬性或制定某些東西與FindControl),但我想不出任何更好方式比兩個控件實現相同的接口。

你可以然後通過另一個屬性來訪問有效控制,例如:

public IMyControl ActiveControl 
{ 
    get 
    { 
    return (isSomeCondition)? myFoo : myBar; 
    } 
}