0

マルチビューコントロールにax数のビューを追加するこのコードがあります。マルチビューコントロールは、ビューが1つしかないページに存在します。ページの初期化で、これらの各ビューに追加されたGridViewコントロールを使用してx個のビューを作成します。ループして、マルチビューコントロールに表示するビューが1つしかないことを確認します。

    protected void variantRepeat_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        if (e.CommandSource.GetType() == typeof(LinkButton))
        {
            string theID = ((LinkButton)e.CommandSource).CommandArgument.ToString();
            ViewCollection views = prodView.Views; //this has only 1 view the one that has been added on the source view of the .aspx page
            foreach (View toDisplay in views)
            {
                if (toDisplay.ID == theID)
                    prodView.SetActiveView(toDisplay);
            }
        }

    }

上記のコードは、ビューを見つけて表示するためにループします。なぜすべてのビューが消えるのですか、私はステップスルーしてinitを実行し、データベースクエリの処理が終了した後、x個のビュー>ソースビューに1個のビューがあります。

なぜこのコントロールはビューを「失う」のですか?

初期化コード:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.QueryString == null || Request.QueryString.Count < 1)
            Response.Redirect(Server.MapPath("~/Packages/"));
        if (!Page.IsPostBack)
        {
            if (Request.QueryString["id"].ToString() == string.Empty)
                Response.Redirect(Server.MapPath("~/Packages/"));
            var id = Server.HtmlEncode(Request.QueryString["id"].ToString());
            Guid packID = Guid.Parse(id);
            using (var context = new GaleEntities())
            {
                var thePackage = context.PackageEnts.First(p => p.packageID == packID);
                var theVariants = thePackage.Variants;
                var mydatasource = new List<PackageEnt> { thePackage };
                var myVariantDataSource = new List<Variant>();
                foreach (Variant single in theVariants)
                {
                    myVariantDataSource.Add(single);
                }
                packageForm.DataSource = mydatasource;
                variantRepeat.DataSource = myVariantDataSource;
                RenderProductGridviews(theVariants);
                prodView.SetActiveView(prodView.Views[0]);
            }
            packageForm.DataBind();
            variantRepeat.DataBind();
            Page.DataBind();
        }
    }

    protected void RenderProductGridviews(System.Data.Objects.DataClasses.EntityCollection<Variant> variantCol)
    {
        foreach (Variant packVar in variantCol)
        {

            View newView = new View();

            GridView prodGrid = new GridView();
            var myProdDataSource = new List<vw_VariantProduct>();             
            using (var context = new GaleEntities())
            {
                var singleProd1 = context.vw_VariantProduct.Where(vp => vp.variantID == packVar.variantID);
                foreach (vw_VariantProduct extProd in singleProd1)
                {
                    myProdDataSource.Add(extProd);
                }
            }
            prodGrid.DataSource = myProdDataSource;

            BoundField _column = new BoundField();
            _column.DataField = "product_title";
            _column.HeaderText = "Product";
            prodGrid.Columns.Add(_column);

            _column = new BoundField();
            _column.DataField = "product_title";
            _column.HeaderText = "Product";
            prodGrid.Columns.Add(_column);

            _column = new BoundField();
            _column.DataField = "product_desc";
            _column.HeaderText = "Description";
            prodGrid.Columns.Add(_column);

            _column = new BoundField();
            _column.DataField = "product_time";
            _column.HeaderText = "Time (mins)";
            prodGrid.Columns.Add(_column);

            _column = new BoundField();
            _column.DataField = "quantity";
            _column.HeaderText = "Quantity";
            prodGrid.Columns.Add(_column);

            prodGrid.DataBind();
            newView.ID = packVar.variantID.ToString();
            newView.Controls.Add(prodGrid);
            prodView.Views.Add(newView);
        }
    }
4

2 に答える 2

3

さて、いつものように、ASP.Netワードの動的コントロールに関するほとんどすべての質問は同じ共通の問題を共有しています...

すべての投稿に動的コントロールを作成する必要があります。ページが最初に読み込まれたときにのみ動的コントロールを作成します。この簡単なルールに従ってください。

  • マスターページを使用していない場合は、PreInitイベントで動的コントロールを作成する必要があります。マスターページを使用している場合は、Initイベントでコントロールを作成します。
  • ビューステートが適用されると(postイベントで)プロパティが上書きされるため、これらのイベントで各postで変更できるプロパティを設定することは避けてください。
  • ページが投稿されるたびに動的コントロールを作成する必要があります。これは避けてくださいif(!this.IsPostBack)this.CreatemyDynamicControls();
  • PreInitイベントまたはInitイベントでコントロールを作成すると、それらの状態はpostイベントで自動的に設定されます。つまり、LoadCompleteイベントでは、各投稿でコントロールを再度作成した場合でも、作成した場合でも、コントロールに状態が含まれます。明示的に状態を設定しません。設計時に作成されたコントロールを処理する場合、この動作は異なることに注意してください。その場合、状態が設定されているイベントはLoadイベントです。
  • イベントサブスクリプションは、PageLoadCompleteの前に発生する必要があります。そうしないと、発生しません。

動的制御に関するいくつかの回答を投稿しました。

https://stackoverflow.com/a/11127064/1268570

https://stackoverflow.com/a/11167765/1268570

ボタンの配列のイベントをクリックします

クリックイベント後にボタン配列が消える

ImageButtonを動的に作成する

このコードは動的コントロールをオンデマンドで作成し、各コントロールは各投稿でその状態を維持します

public partial class DynamicControlsOnDemand : System.Web.UI.Page
{
    public int NumberOfControls
    {
        get
        {
            if (this.ViewState["d"] == null)
            {
                return 0;
            }
            return int.Parse(this.ViewState["d"].ToString());
        }
        set
        {
            this.ViewState["d"] = value;
        }
    }

    protected void Page_PreLoad(object sender, EventArgs e)
    {
        this.CreateDynamicControls();
    }

    protected void addControl_Click(object sender, EventArgs e)
    {
        this.NumberOfControls = this.NumberOfControls + 1;
        this.myPanel.Controls.Add(this.CreateTextbox(this.NumberOfControls));
    }

    private void CreateDynamicControls()
    {
        for (int i = 0; i < this.NumberOfControls; i++)
        {
            var t = this.CreateTextbox(i + 1);
            t.TextChanged += (x, y) => this.lblMessage.Text += "<br/>" + (x as TextBox).ID + " " + (x as TextBox).Text;

            this.myPanel.Controls.Add(t);
        }
    }

    private TextBox CreateTextbox(int index)
    {
        var t = new TextBox { ID = "myTextbox" + index.ToString(), Text = "de" };

        return t;
    }
}

ASPX

    <asp:Panel runat="server" ID="myPanel">
    </asp:Panel>
    <asp:Button Text="Add Control" runat="server" ID="addControl" OnClick="addControl_Click" />
    <asp:Label ID="lblMessage" runat="server" />

出力

ここに画像の説明を入力してください

于 2012-06-25T17:38:20.183 に答える
1

アクティブなビューを設定している最初のコードブロックはイベントに基づいているので、これは?ItemCommandの間に発生すると想定しています。PostBack

内に追加のビューを追加するコードは、ポストバックでPage_Loadない場合にのみ実行されます。if(!Page.IsPostBack)条件文を削除してみてください。すべてのページライフサイクルに動的コントロールを追加する必要があります。

于 2012-06-25T17:36:25.317 に答える