0

在项目中,我有一些用于表单元素的自定义 WebUserControl(它们封装了一些标准验证器和其他系统特定功能)。我的用户控件是“DropDownListField”和“TextBoxField”。在页面后面的代码中,我有以下代码:

string parameterValue = null;
foreach (object control in myMultiView.Views[myMultiView.ActiveViewIndex].Controls)
{
    if (control.GetType() == typeof(DropDownListField))
        parameterValue = ((DropDownListField)control).Value;
    if (control.GetType() == typeof(TextBoxField))
        parameterValue = ((TextBoxField)control).Value;
}

出于某种原因,即使我单步执行代码并看到“控制”被分配给我的 Web 用户控制,“if”语句也总是返回 false。此代码在项目的另一个位置完全相同,除了在另一个位置使用标准 .net 控件“TextBox”和“DropDownList”,而在另一个位置代码可以工作。

有人知道为什么这不适用于网络用户控件吗?

更新:嗯,所以在调试中我发现了这个:

?control.GetType();
BaseType: {Name = "DropDownListField" FullName = "WebUI.UserControls.Fields.DropDownListField"}
?typeof(DropDownListField);
BaseType: {Name = "UserControl" FullName = "System.Web.UI.UserControl"}

所以 typeof 只是认识到它们是用户控件,而不是看起来的完整类型。

有人知道我将如何检查特定的用户控件类型吗?

4

3 回答 3

3

我猜它们不是同一类型,使用调试来找出实际类型。

另外,请尝试使用 ' is ' 关键字。

于 2011-02-09T18:35:12.487 回答
2

PS:如果(控件是DropDownListField)你可能会更清楚

我不记得视图是否直接在 Controls 中包含其子项,但如果 Controls 仅包含一个元素,我不会感到惊讶,这将是某种容器。因此,您的控件可能位于 Controls[0].Controls 甚至更下方。我建议您创建一种递归查找孩子的方法。

实际上,您的控件都应该实现一个通用接口(例如:

interface ICustomFieldWithValue { string Value {get; set; }}

)。您生成的代码会更干净。

于 2011-02-09T18:37:25.193 回答
1

c2.GetType().ToString() == "System.Web.UI.WebControls.Label"

于 2014-01-21T06:08:39.197 回答