我有一个CheckBox和一个HtmlInputCheckBox。这些是Checked属性很常见。我想获得check属性的价值。 我将使用反射,但我不想使用反射。这样的示例代码,
<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 :(得分: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();
答案 1 :(得分: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();
CheckBox类型无法转换为ICommonClass接口,因为此类型不实现它,但新类型NewCheckBox可以实现。 GridView将包含此新类型的控件,以使ICommonClass受益。