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;
}

何らかの理由で、コードをステップ実行して「control」にWebユーザーコントロールが割り当てられていることを確認しても、「if」ステートメントは常にfalseを返します。このコードは、プロジェクト内の別の場所にありますが、他の場所では標準の.netコントロール「TextBox」と「DropDownList」が使用され、他の場所ではコードが機能します。

これがWebユーザーコントロールで機能しない理由を誰かが知っていますか?

更新:うーん、デバッグで私はこれを見つけました:

?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: if (control is DropDownListField) と言う方がわかりやすいかもしれません。

ビューがその子を Controls に直接含んでいるかどうかは覚えていませんが、Controls に含まれる要素が 1 つだけで、それがある種のコンテナーであったとしても驚かないでしょう。したがって、コントロールは 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 に答える