0

ネストされたコントロールが正しく読み込まれないという問題があります。さまざまなページ メソッドを試しましたが、何も機能しないようです。

編集: サイトは正常にコンパイルおよび実行されますが、空白の画面が残るだけです。

基本的に、グラフのラッパー コントロールを使用して、データを選択し、バインドし、多くの抽象化を使用してグラフをカスタマイズできます。簡単に表現したいグラフのグループが存在する可能性があるため、別のラッパー コントロールが必要です。

一般化された答えも素晴らしいでしょう。

これが私が持っているものです。カスタム プロパティ/属性をフィラーに置き換えました。

デフォルト.aspx:

<%@ Page Language="C#" CodeBehind="Default.aspx.cs" %>
<%@ Register src="OuterUserControl.ascx" tagname="OuterUserControl" tagprefix="uc2" %>
<uc2:OuterUserControl ID="uc1" runat="server" Att1="foo" Att2="bar" />

OuterUserControl.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="OuterUserControl.ascx.cs" Inherits="Proj.OuterUserControl" EnableViewState="false" %>
<%@ Register src="InnerUserControl.ascx" tagname="InnerUserControl" tagprefix="uc1" %>
<div runat="server" id="holder"></div>

OuterUserControl.ascx.cs:

private member variables
Att1
Att2
protected void Page_Load(object sender, EventArgs e)
{
for(int i=0;i<5;i++)
 {
  InnerUserControl cuc = new InnerUserControl(id);
  holder.Controls.Add(cuc);
 }
}

InnerUserControl.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="InnerUserControl.ascx.cs" Inherits="Proj.InnerUserControl" %>
<asp:Chart ID="chart" runat="server"></asp:Chart>

InnerUserControl.ascx.cs:

private int id;
//private member variables
public InnerUserControl(int id)
{
this.id = id;
this.chart = new Chart();
}
protected void Page_Load(object sender, EventArgs e)
{
//Get data for given id
//Databind chart
//etc..
}
4

3 に答える 3

3

コード ビハインドからユーザー コントロールを追加する場合は、実際にコントロールを読み込む必要があります。これを行うには、次のようにします。

protected void Page_Load(object sender, EventArgs e)
{
    for(int i=0;i<5;i++)
    {
        InnerUserControl cuc = (InnerUserControl)this.Page.LoadControl("InnerUserControl.ascx");

        holder.Controls.Add(cuc);
    }
 }

それらが同じディレクトリにあると仮定します。そうでない場合は、仮想パスをパラメーターとして LoadControl メソッドに入れます。これを行う場合、外側のコントロールに register ステートメントを含める必要はありません。また、私は通常、div タグの代わりにコード フロントで を使用します。ただし、これが違いを生むかどうかはわかりません。コントロール OnInit をロードすることもお勧めします。これにより、ライフサイクルのすべてのフェーズがユーザー コントロールに対して実行されるようになります。

幸運を!

于 2009-07-29T16:46:17.057 に答える
0

別のアプローチをお勧めします。コード ビハインドでコントロール オブジェクトをインスタンス化し、それをコントロール コレクションに追加する代わりに (おそらく LoadControl() を適切に実行し、それを page_load よりも前に実行してページのライフサイクルにフックする必要があると思います)、追加します。 OuterUserControl で宣言的に内部コントロール。

(例のように) InnerUserControl を 5 回追加する必要がある場合は、リピーター内で InnerUseControl を宣言します。それはIDのリストにバインドされています。

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="OuterUserControl.ascx.cs" Inherits="Proj.OuterUserControl" EnableViewState="false" %>
<%@ Register src="InnerUserControl.ascx" tagname="InnerUserControl" tagprefix="uc1" %>
       <asp:Repeater ID="Repeater1" runat="server" DataSourceID="src">
    <ItemTemplate>
      <uc1:InnerUserControl id="iuc" runat="server" ID='<%#Eval("ID")%>'/>
    </ItemTemplate>
    </asp:Repeater>

    <asp:ObjectDataSource ID="src" runat="server" SelectMethod="IDList" 
        TypeName="Web.Default"></asp:ObjectDataSource>
于 2009-07-15T03:58:48.853 に答える
0

追加してみましたか

<%@ Reference Control="InnerUserControl.ascx" %>

OuterUserControl.ascx へ

于 2009-07-08T18:01:41.197 に答える