繁体   English   中英

动态放置的用户控件asp.net C#无法触发事件

[英]Event not firing with dynamically placed user control asp.net c#

我试图创建一个网页,该网页根据从SQL Server和SQL Server返回的问题类型显示动态放置的WebUserControls。 当您按下用户控件上的按钮时,它将使用“ CheckResult”过程检查用户控件的结果。 由于某些原因,当您单击用户控件内的按钮(“ cmdProcess”)时,不会触发事件“ CheckResult”。 请问我做错了什么?

用户控制代码为:-

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Testing.Event_Delegate
{
    public partial class WebUserControl2 : System.Web.UI.UserControl
    {

        // Delegate declaration
        public delegate void PhotoUploaded(string strFilename, String FailureMessage, string strFabricationNo, string strPartNo, string strBatchNo, string strPartSN, string strSTK_SerialNo, string strSTK_PartNo);

        // Event declaration
        public event PhotoUploaded Resultresponse;

        string questionAsked;

        public string QuestionText
        {
            set { questionAsked = value; }
            get { return questionAsked; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            Label1.Text = QuestionText;
            TextBox1.Focus();
        }

        protected void cmdProcess_Click(object sender, EventArgs e)
        {
            if (Resultresponse != null)
            {
                Resultresponse("Passed", "", "", "", "", "", "", "");
            }
            TextBox1.Text = "";

        }


    }
}

用户控件所在的ASPX主页是:-

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace Testing.Event_Delegate
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        WebUserControl2 QT2;
        WebUserControl3 QT3;
        DataTable dtQuestionSet;

        protected void Page_Load(object sender, EventArgs e)
        {
            // all controls need to be rendered every page postback otherwise the rest of the code loses scope.
            QT2 = (WebUserControl2)this.LoadControl("WebUserControl2.ascx");            
            QT3 = (WebUserControl3)this.LoadControl("WebUserControl3.ascx");

            if (IsPostBack == false)
            {
                Session["Counter"] = 0;
                Session["QuestionCount"] = 0;
                Session["CompletedInsp"] = false;
                Session["RunInsp"] = false;
                dtQuestionSet = new DataTable();
                MakeDataTabledtQuestionSet();
            }
            else
            {               
                dtQuestionSet = (DataTable)Session["DataTableW"];
                //check to see if the inspection process is complete and display pass\fail and log. Else carry on.
                if (Convert.ToBoolean(Session["CompletedInsp"]) == true)
                {
                    //Response.Write("Failed");
                    ModalPopupExtender2.Show();
                    return;
                }
            }
            Session["DataTableW"] = dtQuestionSet;
        }

        void CheckResult(string Result, string FailureMessage, string FabricationNo, string PartNo, string BatchNo, string PartSN, string STK_SerialNo, string STK_PartNo)
        {
            Label1.Text = "You Answered: - " + Result;

            if ((Convert.ToInt32(Session["Counter"]))>= Convert.ToInt32(Session["QuestionCount"]))
            {
                Session["CompletedInsp"] = true;
                Session["RunInsp"] = false;
            }
            else
            {
                dtQuestionSet = (DataTable)Session["DataTableW"];
            }

            Session["Counter"] = Convert.ToInt32(Session["Counter"]) + 1;

            //If the inspection hasn't been completed carry on and ask next question.
            if (Convert.ToBoolean(Session["RunInsp"]) == true)
            {
                RunInspection();
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Redirect("WebForm1.aspx");
        }

        protected void cmdStartInspection_Click(object sender, EventArgs e)
        {
            Session["Counter"] = 0;
            GetQuestions();
        }

        protected void GetQuestions()
        {

            dtQuestionSet.Clear();
            SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["PromptedInspConnectionString"].ConnectionString);
            conn.Open();

            SqlCommand cmd = new SqlCommand("test.GetQuestions", conn);
            SqlDataReader dr = null;
            cmd.CommandType = CommandType.StoredProcedure;

            dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                DataRow drQuestions = dtQuestionSet.NewRow();
                drQuestions["QuestionText"] = dr[1].ToString();
                drQuestions["ExpectedResponse"] = dr[2].ToString();
                drQuestions["QuestionType"] = dr[3].ToString();
                dtQuestionSet.Rows.Add(drQuestions);
            }
            Session["DataTableW"] = dtQuestionSet;
            Session["QuestionCount"] = dtQuestionSet.Rows.Count;

            conn.Close();

            RunInspection();
            Session["RunInsp"] = true;
        }

        protected void RunInspection()
        {

            //Populate the user controls
            switch (dtQuestionSet.Rows[Convert.ToInt32(Session["counter"])][2].ToString())
            {                              
                case "1":            
                    QT2.QuestionText = dtQuestionSet.Rows[Convert.ToInt32(Session["counter"])][0].ToString();
                    QT2.Resultresponse += new WebUserControl2.PhotoUploaded(CheckResult);
                    break;
                case "2":
                    QT3.QuestionText = dtQuestionSet.Rows[Convert.ToInt32(Session["counter"])][0].ToString();
                    QT3.Resultresponse += new WebUserControl3.PhotoUploaded(CheckResult);
                    break;
            }

            //Add the usercontrols to the form 
            PlaceHolder2.Controls.Add(QT2);
            PlaceHolder2.Controls.Add(QT3);

            //Need to set the visability of the usercontrol so it only shows the usercontrol that is displaying the question
            QT2.Visible = false;
            QT3.Visible = false;

            switch (dtQuestionSet.Rows[Convert.ToInt32(Session["counter"])][2].ToString())
            {
                case "1":
                    QT2.Visible = true;
                    break;
                case "2":
                    QT3.Visible = true;
                    break;
            }
        }

        private void MakeDataTabledtQuestionSet()
        {
            dtQuestionSet.Columns.Add("QuestionText");
            dtQuestionSet.Columns.Add("ExpectedResponse");
            dtQuestionSet.Columns.Add("QuestionType");
        }

    }
}

尝试在OnPreInit中初始化控件,而不是加载控件。 控件绑定是在OnPreInit中完成的。

请参阅页面生命周期事件MSDN参考

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM