Необходимо обновить страницу дважды, чтобы настраиваемые свойства влияли на элементы управления с привязкой к данным. - PullRequest
0 голосов
/ 17 февраля 2012

Я делаю простую веб-часть, которая запрашивает базу данных SQL, чтобы вывести список людей в раскрывающийся список. Когда пользователь из этого выпадающего списка выбран, он заполняет таблицу данных дополнительной информацией об этом пользователе с помощью другого SQL-запроса.

У меня есть SQL Server и база данных SQL в качестве пользовательских свойств.

Моя проблема в том, что когда изменяются пользовательские свойства и нажимается «Ok», элемент управления с привязкой к данным не заполняется. Вместо этого мне нужно снова обновить страницу, чтобы мои данные связались.

Я знаю, что это проблема жизненного цикла веб-части, поэтому надеялись, что вы, ребята, сможете мне помочь.

Я попытался поместить свой код привязки данных в OnPreRender, как предложено здесь , но затем я обнаружил, что когда пользователь был изменен в раскрывающемся списке, он будет повторно связывать все данные и автоматически устанавливать пользователь вернулся первым в списке.

Весь мой код:

using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Data;
using System.Data.SqlClient;
using Microsoft.SharePoint.WebPartPages;
using WebPart = System.Web.UI.WebControls.WebParts.WebPart;


namespace SampleProject.SampleWebPart
{
    [ToolboxItemAttribute(false)]
    public class SampleWebPart : WebPart
    {
        public DropDownList dl = null;
        public DataGrid dg = null;
        private string _SqlServer;
        private string _SqlDb;

        [Personalizable(PersonalizationScope.Shared),
         WebBrowsable(true),
         WebDisplayName("SQL Server"),
         WebDescription("Specify the SQL Server to connect to. eg. VM188"),
         SPWebCategoryName("Data Connection Properties"),
         DefaultValue(".")]
        public string SqlServer
        {
            get { return _SqlServer; }
            set { _SqlServer = value; }
        }

        [Personalizable(PersonalizationScope.Shared),
        WebBrowsable(true),
        WebDisplayName("Database Name"),
        WebDescription("Specify the Database to connect to. eg. Test"),
        SPWebCategoryName("Data Connection Properties"),
        DefaultValue("Test")]
        public string SqlDb
        {
            get { return _SqlDb; }
            set { _SqlDb = value; }
        }

        protected override void CreateChildControls()
        {
            if (string.IsNullOrEmpty(this.SqlServer) || string.IsNullOrEmpty(this.SqlDb))
            {
                //If just added, ask to configure in toolpane first.
                LiteralControl literalCtrl = new LiteralControl(
                string.Format("<a id='MsoFrameworkToolpartDefmsg_{0}' href=\"javascript:ShowToolPane2Wrapper('Edit','129','{0}');\">Open the tool pane and enter a valid value.", this.ID));
                this.Controls.Add(literalCtrl);
            }
            else
            {
                try
                {


                    System.Web.UI.UpdatePanel detailsUpdatePanel = new System.Web.UI.UpdatePanel();
                    detailsUpdatePanel.ID = "DetailsUpdatePanel";
                    detailsUpdatePanel.UpdateMode = UpdatePanelUpdateMode.Conditional;
                    this.Controls.Add(detailsUpdatePanel);

                    dl = new DropDownList();
                    dg = new DataGrid();

                    dl.AutoPostBack = true;
                    dl.SelectedIndexChanged += new EventHandler(dl_SelectedIndexChanged);

                    dl.ID = "selectPersonDl";
                    dg.ID = "personDetailsDg";
                    detailsUpdatePanel.ContentTemplateContainer.Controls.Add(dl);
                    detailsUpdatePanel.ContentTemplateContainer.Controls.Add(dg);

                    if (!Page.IsPostBack)
                    {
                        //Populate the drop down list
                        dl.DataSource = GetNames();
                        dl.DataValueField = "Person";
                        dl.DataTextField = "Person";
                        dl.DataBind();

                        //Populate the data grid
                        dg.DataSource = GetData(dl.SelectedValue);
                        dg.DataBind();
                    }

                }
                catch (Exception ex)
                {
                    Label lblError = new Label();
                    lblError.Text = ex.Message;
                    this.Controls.Add(lblError);
                }

                Label lblServ = new Label();
                lblServ.Text = this.SqlServer;
                this.Controls.Add(lblServ);
                Label lblDb = new Label();
                lblDb.Text = this.SqlDb;
                this.Controls.Add(lblDb);



                base.CreateChildControls();
            }
        }


        protected void dl_SelectedIndexChanged(object sender, EventArgs e)
        {
            //
            dg.DataSource = GetData(dl.SelectedValue);
            dg.DataBind();
        }

        protected SqlDataReader GetNames()
        {
            SqlConnection cn = new SqlConnection("server=" + this.SqlServer + "; database=" + this.SqlDb + ";integrated security=true");
            SqlCommand cmd = new SqlCommand("Select Person from Sample", cn);
            cn.Open();
            return cmd.ExecuteReader();
        }

        protected SqlDataReader GetData(string person)
        {
            SqlConnection cn = new SqlConnection("server=" + this.SqlServer + "; database=" + this.SqlDb + ";integrated security=true");
            SqlCommand cmd = new SqlCommand("Select DateMod, Sample FROM Sample WHERE Person='" + person + "'", cn);
            cn.Open();
            return cmd.ExecuteReader();

        }

    }
}

ПРИМЕЧАНИЕ. Я еще немного подумал - может быть, потому что привязка обернута в оператор! IsPostBack if? Я не уверен ...

1 Ответ

1 голос
/ 17 февраля 2012

Вы должны активировать привязку данных либо в Page_Load, либо в Page_PreRender.
Вы правы, когда говорите, что выбор пользователей будет отброшен, если вы просто привязываете данные одним из этих двух методов.только для привязки данных, если страница загружена без обратной передачи.
Ваш page_prerender или page_load должен выглядеть следующим образом:

if(!IsPostBack)
{
  dg.DataSource = GetData();
  dg.DataBind();
}
...