Я делаю простую веб-часть, которая запрашивает базу данных 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? Я не уверен ...