アロハ、
クラス内からインスタンス化してページに追加する必要があるカスタム コントロールがあります。私のクラスには渡す関数があるPage
ため、ページ上のコントロールにアクセスできます。このメソッドを使用して、標準の ASP コントロールを既に追加しており、すべてが期待どおりに機能しています。私の問題は、カスタム コントロールの型が定義されていることです。
hereを読んで.csをコントロールからApp_Codeフォルダーに移動しましたが、そうすると、ascxのコントロールが有効であると見なされないため、コンパイルされません。たとえば、私は得るCS0103: The name 'litTest' does not exist in the current context
。これらは部分クラスであるため、App_Code フォルダーに新しい空の部分クラスを作成し、コントロールの .cs ファイルはそのままにしました。
このようにコンパイルされますが、コントロールを Page.controls コレクションに追加すると、ページ上の本来あるべき場所に何も表示されません。たとえばTEST
、ascx ファイルの末尾に追加しましたが、ページには表示されません。さらに、コントロールには、空の部分クラスを使用するときにアクセスできない変数を設定する必要があります。
私がやろうとしていることが標準コントロールで機能することはわかっていますが、カスタム コントロールでこれを機能させることができないのはなぜですか?
App_Code フォルダー内の私の部分クラス:
public partial class CustomControlClass : System.Web.UI.UserControl
{
}
ユーザーコントロールの私の部分クラス:
public partial class CustomControlClass : System.Web.UI.UserControl
{
private int _myValue= -1;
public int myValue
{
get { return _myValue; }
set { _myValue= value; }
}
protected void Page_Init(object sender, EventArgs e)
{
litTest.Text = "TEST";
}
}
私のユーザーコントロール ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CustomControlClass.ascx.cs" Inherits="CustomControlClass" %>
<asp:Literal ID="litTest" runat="server"></asp:Literal>
TEST
私の App_Code クラス:
public class MyClass
{
public static void doWork(Page Ctrl)
{
CustomControlClass c = new CustomControlClass();
//c.myValue = 1; // Wont compile with this line
Ctrl.Controls.Add(c);
Literal l = new Literal();
l.Text = "HELLO";
Ctrl.Controls.Add(l);
}
}
ページ出力には、TEST という単語がまったくありません。HELLO という単語が問題なく表示されます。私はMyClass.doWork()
ページとコールバックからLoad
呼び出してみましたが、すべてがダメになりましたInit
。PreInit
アップデート:
Minh Nguyenが示唆したように、コントロールをロードするために使用できますがCtrl.LoadControl("~/Controls/CustomControlClass.ascx");
、それを独自のタイプとしてキャストすることはできません。コントロールタイプとして割り当てる必要があります。
Control c= Ctrl.LoadControl("~/Controls/CustomControlClass.ascx");
これを行うと、コントロールをページに追加して、期待どおりに動作させることができます。欠点は、どのコントロール プロパティにもアクセスできないことです。これを解決するために、私はこれをやっています:
c.GetType().GetProperty("myValue").SetValue(c, 1, null);
これは機能しますが、使用するのにどれくらいの費用がかかるかわかりません。コントロールをキャストできたらいいのにと思いますが、試してみるとエラーが発生します。
他のオプションがあるかどうかを確認するために、これには少し答えないままにしておきます。