2011-01-24 5 views
0

私はそれを文字列として渡したいと思います。ありがとう!リファレンスのUserControlクラスベースオフ文字列値

+1

こんにちは、あなたが長期的にやろうとしていますか?ユーザーコントロールを動的に読み込みますか? – WraithNath

+0

No.私はこれを使用して、Webコントロール(txtboxやドロップダウンなど)を参照してから、その値をSQLパラメータに渡すことができます。私はこのコードに渡す必要がある複数のUserControlsを持っているので、私はハードコードされたものを持っていることを望んでいません。私はほとんど終わっている...これは私が残したパズルの最後の部分であるようだ。 – crjunk

+0

'strucParam'とは何ですか?' ParentFindControl'とは何ですか? –

答えて

0

ヒント:

あなたはあなたの方法にのSystem.Typeを渡す必要があります...

あなたはObject.GetType()ともtypeof演算子を使用する必要があります。

Webフォーム

<h2>Passing Types</h2> 
<asp:Panel runat="server" ID="pnl1"> 
    <p> 
     <asp:TextBox runat="server" ID="txt1" /> 
    </p> 
    <p> 
     <asp:DropDownList runat="server" ID="ddl1" /> 
    </p> 
    <p> 
     <asp:HyperLink runat="server" ID="hl1" Text="Link1" NavigateUrl="http://www.google.co.uk" Target="_blank" /> 
    </p> 
</div> 
<asp:Label runat="server" ID="lout" /> 
<div> 
    <p> 
     <asp:DropDownList runat="server" ID="ddlTypes"> 
     </asp:DropDownList> 
     &nbsp; 
     <asp:Button runat="server" ID="btnGetValueFromType" Text="Get Value By Control Type" onclick="btnGetValueFromType_Click" /> 
    </p> 
</asp:Panel> 
:あなたはまた、その現在実行中のアセンブリまたは下記 AssemblyQualifiedName

基本的な考え方であればその修飾名を使用して、クラスのタイプのインスタンスを作成することができます

CodeBehind謝罪、私がして以来ずっとずっとでした。 VB.net ので、この例では、 C#のである)

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (! IsPostBack){ 
      buildGui(); 
     } 
    } 

    private void buildGui(){ 
     List<string> lstStrings = new List<string>(5); 

     lstStrings.Add("one"); 
     lstStrings.Add("two"); 
     lstStrings.Add("three"); 
     lstStrings.Add("four"); 
     lstStrings.Add("five"); 

     ddl1.DataSource = lstStrings; 
     ddl1.DataBind(); 

     //Populate the Types Dropdown with some fullyqualified type names (includes the assembly name,version number, PublicKey etc.) 
     Dictionary<string, string> lstTypes = new Dictionary<string, string>(3); 

     lstTypes.Add(this.ddl1.GetType().Name, this.ddl1.GetType().AssemblyQualifiedName); 
     lstTypes.Add(this.txt1.GetType().Name, this.txt1.GetType().AssemblyQualifiedName); 
     lstTypes.Add(this.hl1.GetType().Name, this.hl1.GetType().AssemblyQualifiedName); 

     //lstTypes.Add(this.hl1.GetType().Name, this.hl1.GetType().AssemblyQualifiedName); 
     lstTypes.Add(this.CRJunk01.GetType().Name, this.CRJunk01.GetType().AssemblyQualifiedName); 

     ddlTypes.DataSource = lstTypes; 
     ddlTypes.DataValueField = "value"; 
     ddlTypes.DataTextField = "key"; 
     ddlTypes.DataBind(); 
    } 

    protected void btnGetValueFromType_Click(object sender, EventArgs e) 
    { 
     Type t = Type.GetType(ddlTypes.SelectedValue); 

     lout.Text = "Looking for a type: " + t.ToString(); 

     foreach(Control c in this.pnl1.Controls){ 
      if (c.GetType().Equals(Type.GetType(ddlTypes.SelectedValue)))//Look for controls whose type is the same as the type selected in ddl1. 
      { 
       lout.Text += string.Format("<br/>Got Control of type: {0}", c.GetType().Name); 
       //Cast to your custom Interface/BaseClass and extract the value. 
       lout.Text += "<br/>Value is: " + ((ICrJunkControl)(c)).ControlValue; 
      } 
     } 
    } 

これは、おそらく「レバレッジ」する必要がありますものの一種です。

最後の注意点は、すべてのカスタムコントロールが基本クラスまたはインターフェイスから継承されている場合に最適です。こうすることで、オブジェクトのタイプに基づいてオブジェクトを配置したときに、そのオブジェクトをインターフェイスまたはベースクラスにキャストしてから、別の共有メンバーの値を取得できます。 ControlValue。基本クラスの実装はこれをオーバーライドします。これは、異なるメンバーが自分の状態を公開する異種のコントロールに関連する問題を克服するのに役立ちます。

テキストボックス - >テキスト
のDropDownList - > SelectedValueの
ハイパーリンク - >テキスト/ NavigateUrl

HTH、

0

インターフェイスを使用して、ユーザーコントロール上でそれを実装。その後、ユーザーコントロールをインターフェイスにキャストし、すべての共通のプロパティとメソッドを利用できます。

Public Interface ucInterface 

    Property textbox() As String 
    Function calculate() As Double 

End Interface 

Public Class UserControl_appName 
    Inherits System.Web.UI.UserControl 
    Implements ucInterface 

    Public Function calculate() As Double Implements ucInterface.calculate 
     Return 99/10 
    End Function 

    Public Property textbox() As String Implements ucInterface.textbox 
     Get 
      Return txtBox.text 
     End Get 
     Set(ByVal value As String) 
      txtBox.text = value 
     End Set 
    End Property 

End Class 

Public Class Test 
    Public Sub Test() 

     Dim ucAppName As ucInterface = CType(Parent.FindControl(strucParam(i).ParentFindControl), ucInterface) 

     ucAppName.textbox = "Test 1" 
     ucAppName.calculate() 

    End Sub 
End Class 
+0

私が投稿したコードは、UserControlボタンのナビゲーションにあります。それをUC_Bとしましょう。ユーザーがボタンをクリックすると、複数のUserControls(UC_Aで検索されたこれらのUserControslの1つを呼び出す)を検索し、txtFirstNameなどのWebControlsにアクセスします。私はWebControlsの名前とコントロールに関する他の追加情報を知っている構造を持っています。 UC_A、UC_B、...、UC_Zは私のAccountInfo.aspxページに表示されます。私はUserControlsの任意の組み合わせを持つことができます。だから私はInterfaceがこの場合にはうまくいくとは思わない? – crjunk

0

システムをチェックアウトします。また、他のアセンブリから、または参照されたライブラリからオブジェクトを取得することもできます。もちろん、これが機能するには、このコードが「オブジェクト」への参照を返すことを覚えておく必要があります。すべてのコントロールの共通実装を無効にするインタフェースを定義するか、型判定の別の手段のいずれかを定義することもできます。

Imports System.Reflection 
Public Class ObjectFactory 
Public Shared Function NamedObject(ByVal ObjectName As String) As Object 
    Dim Assem = [Assembly].GetExecutingAssembly() 

    Dim MyType As Type = Assem.GetType(ObjectName.Trim) 
    Dim MyObject As Object = Nothing 
    Try 
     MyObject = Activator.CreateInstance(MyType) 
    Catch MyProblem As TargetInvocationException 
     MessageBox.Show(MyProblem.ToString) 
    End Try 

    Return MyObject 
End Function 

エンドクラス

関連する問題