2012-03-02 92 views
0

我有一個CheckBox和一個HtmlInputCheckBox。這些是Checked屬性是常見的。我想獲得已檢查屬性的值。 我會盡量使用反射,但我不想使用反射。示例代碼這樣,我可以組合兩個或更多具有共同屬性的類嗎?

<input type="checkbox" id="checkBoxHtml" runat="server" /> 
<asp:CheckBox ID="checkbox" runat="server" /> 

這些是在gridview中。

我可以在gridview中使用FindControl找到它們,但FindControl返回類型是Control。 所以我需要使用Cast來獲取選中的值。我想訪問的控件可以是不同的類型。例如,CheckBox或HtmlInputCheckBox等。因此,我想使用一種類型進行投射。

我想這種方式,

public interface ICommonClass 
{ 
    bool GetChecked(); 
} 

public class NewCheckBox:CheckBox,ICommonClass 
{ 
    public bool GetChecked() 
    { 
     return Checked; 
    } 
} 

public class NewHtmlInputCheckBox:HtmlInputCheckBox,ICommonClass 
{ 
    public bool GetChecked() 
    { 
     return Checked; 
    } 
} 

var obj = (ICommonClass)gridview.FindControl("checkbox"); 
var obj = (ICommonClass)gridview.FindControl("checkboxHtml"); 

obj.GetChecked(); 

此代碼不會運行。因爲它會在投射時發生錯誤。正確的,這已經:)我給了這個例子,我告訴我的想法。這樣的事情可以做到嗎?

+0

製作GetChecked抽象所以每一個派生類需要推導一個GetChecked方法(只改進,而不是解決問題的辦法)。 – 2012-03-02 09:27:52

+0

FindControl可能返回某種類型...您需要使用與FindControl的返回類型相同的類型派生ICommonClass – 2012-03-02 09:28:57

回答

3

我個人不會打擾這一切。只需編寫一個簡單的擴展方法來檢查控件的類型並進行適當的強制轉換。

public static class ControlHelpers { 
    public static bool GetChecked(this Control ctrl) { 
     if(ctrl is CheckBox) { 
      return ((CheckBox) ctrl).Checked; 
     } else if(ctrl is HtmlInputCheckBox) { 
      return ((HtmlInputCheckBox) ctrl).Checked; 
     } else { 
      throw new InvalidCastException("Some sort of CheckBox is required here."); 
     } 
    } 
} 

然後你可以使用它像這樣:

bool checked = gridview.FindControl("checkbox1").GetChecked(); 
0

由於這些是新控件,因此需要在web.config or at the page level中註冊。然後你可以在頁面中使用它們。

<myPrefix:NewCheckBox runat="server" ID="checkbox" /> 
<myPrefix:NewHtmlInputCheckBox runat="server" ID="checkBoxHtml" /> 

然後你可以使用自己的接口

var checkbox = (ICommonClass)gridview.FindControl("checkbox"); 
var checkBoxHtml = (ICommonClass)gridview.FindControl("checkBoxHtml") 
var checked1 = checkbox.GetChecked(); 
var checked2 = checkBoxHtml .GetChecked(); 

複選框類型不能被強制轉換爲ICommonClass接口,因爲這種類型的沒有實現它,但新類型NewCheckBox一樣。 GridView將包含這個新類型的控件,以使ICommonClass受益。

+0

對不起,我寫錯了。我添加了runat =「server」。 – sinanakyazici 2012-03-02 09:32:36

+0

你得到的錯誤是什麼? – 2012-03-02 09:33:53

+0

接口正常,但由於投射而出現錯誤。錯誤:無法投射「System.Web.UI.WebControls.CheckBox」類型的對象來鍵入「ICommonClass」。 – sinanakyazici 2012-03-02 09:37:33

相關問題