求教高手WEB PART通信問題
我按照《ASP.NET2.0開發指南》上所述測試WEB PART通信,結果測試靜態連接是OK的,而動態連接卻實現不了。(動態連接 是在REMARK掉STATICCONNECTION代碼段後添加CONNECTIONSZONE組件基礎上測試的。書上說CONNECTIONSZONE可以自動管理,不用編寫任何代碼)
靜態測試畫面
動態測試畫面
(此為為看到謂詞而添加的登陸界面)
單擊“連接”進入連接模式
單擊“通信提供者”謂詞(connection)
至此,“通信訂閱者”為何沒有呈現呢?為何CONNECTIONSZONE組件提示沒有活動連接呢?請高手指教。
下面附上SOURCECODE
通信提供者
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
/// <summary>
/// EmployeesWebPart 的摘要说明
/// </summary>
namespace ConnWebPart
{
/// <summary>
/// 創建接口IEmployeeInfo,其中定義屬性EmployeeID
/// </summary>
public interface IEmployeeInfo
{
int EmployeeID { get;set;}
}
public class EmployeesWebPart:WebPart ,IEmployeeInfo
{
/// <summary>
/// 定義構造函數
/// </summary>
public EmployeesWebPart()
{
//
// TODO: 在此处添加构造函数逻辑
//
this.Title = "通信提供者";
this.TitleIconImageUrl = ""; } //定義私有成員
private int _empID = 1;
private TextBox txt;
private Button btn;
private AccessDataSource ads;
private DetailsView dv; //定義接口IEmployeeInfo成員EmployeeID
public int EmployeeID
{
get { return _empID; }
set { _empID = value; }
} //定義方法ProviderEmployeeInfo,傳送連接數據
[ConnectionProvider("EmployeeIDProvider", "EmployeeIDProvider")]
public IEmployeeInfo ProviderEmployeeInfo()
{
return this;
}
//重寫OnLoad方法,向主控件中添加部分子控件
protected override void OnLoad(EventArgs e)
{
txt = new TextBox();
txt.Width = Unit.Pixel(30);
txt.Text = EmployeeID.ToString();
Controls.Add(txt); btn = new Button();
btn.Text = "搜索";
btn.Click += new EventHandler(OnFindEmployee);
Controls.Add(btn);
//base.OnLoad(e);
} //呈現控件用戶界面
protected override void RenderContents(HtmlTextWriter writer)
{ if (_empID < 1)
{
writer.Write("<span style='color:gray'>請在文本框中輸入大於等于1的值。</span>");
return;
}
else
{
writer.Write("輸入EmployeeID:");
txt.RenderControl(writer);
btn.RenderControl(writer);
writer.Write("<hr size=1>");
ads = new AccessDataSource();
ads.ID = "accessDataSource1";
ads.DataFile = "~/App_Data/Nwind.mdb";
ads.SelectCommand = "select EmployeeID,LastName,FirstName,title,notes from employees where employeeid=" + _empID.ToString();
Controls.Add(ads); dv = new DetailsView();
dv.DataSourceID = "accessDataSource1";
dv.GridLines = GridLines.None;
dv.CellPadding = 3;
dv.FieldHeaderStyle.Font.Bold = true;
Controls.Add(dv);
dv.RenderControl(writer); } //base.RenderContents(writer);
} //實現按鈕的事件處理程序
private void OnFindEmployee(object sender, EventArgs e)
{
_empID = Convert.ToInt32(txt.Text);
} }
}
通信訂閱者
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
/// <summary>
/// OrdersWebPart 的摘要说明
/// </summary>
namespace ConnWebPart
{
public class OrdersWebPart : WebPart
{
/// <summary>
///
/// </summary>
public OrdersWebPart()
{
//
// TODO: 在此处添加构造函数逻辑
//
this.Title = "通信訂閱者";
this.TitleIconImageUrl = ""; } private int _empID;
private GridView gv = new GridView();
private AccessDataSource ads; //實現控件用戶界面
protected override void RenderContents(HtmlTextWriter writer)
{
//if (_empID < 1)
//{
// writer.Write("<span style='color:gray'>請在文本框中輸入大於等于1的值</span>");
// return;
//}
//else
//{
ads = new AccessDataSource();
ads.ID = "accessDataSource1";
ads.DataFile = "~/App_Data/Nwind.mdb";
ads.SelectCommand = "select top 8 orderid,customerid,employeeid,orderdate from orders where employeeid=" + _empID.ToString();
Controls.Add(ads);
gv = new GridView();
gv.DataSourceID = "accessDataSource1";
gv.CellPadding = 3;
gv.GridLines = GridLines.None;
gv.BorderWidth = 0;
Controls.Add(gv);
gv.RenderControl(writer); //}
//base.RenderContents(writer);
}
//
[ConnectionConsumer("EmployeeIDConsumer", "EmployeeIDConsumer")]
public void GetEmployeeInfo(IEmployeeInfo empInfo)
{
if (empInfo != null)
{
_empID = empInfo.EmployeeID;
}
else
{
throw new NotSupportedException("未能連接ACCESS數據庫。");
} } }}
主程序
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
protected void Button1_Click(object sender, EventArgs e)
{
WebPartManager1.DisplayMode = WebPartManager.BrowseDisplayMode;
}
protected void Button2_Click(object sender, EventArgs e)
{
WebPartManager1.DisplayMode = WebPartManager.ConnectDisplayMode;
}
}
我按照《ASP.NET2.0開發指南》上所述測試WEB PART通信,結果測試靜態連接是OK的,而動態連接卻實現不了。(動態連接 是在REMARK掉STATICCONNECTION代碼段後添加CONNECTIONSZONE組件基礎上測試的。書上說CONNECTIONSZONE可以自動管理,不用編寫任何代碼)
靜態測試畫面
動態測試畫面
(此為為看到謂詞而添加的登陸界面)
單擊“連接”進入連接模式
單擊“通信提供者”謂詞(connection)
至此,“通信訂閱者”為何沒有呈現呢?為何CONNECTIONSZONE組件提示沒有活動連接呢?請高手指教。
下面附上SOURCECODE
通信提供者
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
/// <summary>
/// EmployeesWebPart 的摘要说明
/// </summary>
namespace ConnWebPart
{
/// <summary>
/// 創建接口IEmployeeInfo,其中定義屬性EmployeeID
/// </summary>
public interface IEmployeeInfo
{
int EmployeeID { get;set;}
}
public class EmployeesWebPart:WebPart ,IEmployeeInfo
{
/// <summary>
/// 定義構造函數
/// </summary>
public EmployeesWebPart()
{
//
// TODO: 在此处添加构造函数逻辑
//
this.Title = "通信提供者";
this.TitleIconImageUrl = ""; } //定義私有成員
private int _empID = 1;
private TextBox txt;
private Button btn;
private AccessDataSource ads;
private DetailsView dv; //定義接口IEmployeeInfo成員EmployeeID
public int EmployeeID
{
get { return _empID; }
set { _empID = value; }
} //定義方法ProviderEmployeeInfo,傳送連接數據
[ConnectionProvider("EmployeeIDProvider", "EmployeeIDProvider")]
public IEmployeeInfo ProviderEmployeeInfo()
{
return this;
}
//重寫OnLoad方法,向主控件中添加部分子控件
protected override void OnLoad(EventArgs e)
{
txt = new TextBox();
txt.Width = Unit.Pixel(30);
txt.Text = EmployeeID.ToString();
Controls.Add(txt); btn = new Button();
btn.Text = "搜索";
btn.Click += new EventHandler(OnFindEmployee);
Controls.Add(btn);
//base.OnLoad(e);
} //呈現控件用戶界面
protected override void RenderContents(HtmlTextWriter writer)
{ if (_empID < 1)
{
writer.Write("<span style='color:gray'>請在文本框中輸入大於等于1的值。</span>");
return;
}
else
{
writer.Write("輸入EmployeeID:");
txt.RenderControl(writer);
btn.RenderControl(writer);
writer.Write("<hr size=1>");
ads = new AccessDataSource();
ads.ID = "accessDataSource1";
ads.DataFile = "~/App_Data/Nwind.mdb";
ads.SelectCommand = "select EmployeeID,LastName,FirstName,title,notes from employees where employeeid=" + _empID.ToString();
Controls.Add(ads); dv = new DetailsView();
dv.DataSourceID = "accessDataSource1";
dv.GridLines = GridLines.None;
dv.CellPadding = 3;
dv.FieldHeaderStyle.Font.Bold = true;
Controls.Add(dv);
dv.RenderControl(writer); } //base.RenderContents(writer);
} //實現按鈕的事件處理程序
private void OnFindEmployee(object sender, EventArgs e)
{
_empID = Convert.ToInt32(txt.Text);
} }
}
通信訂閱者
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
/// <summary>
/// OrdersWebPart 的摘要说明
/// </summary>
namespace ConnWebPart
{
public class OrdersWebPart : WebPart
{
/// <summary>
///
/// </summary>
public OrdersWebPart()
{
//
// TODO: 在此处添加构造函数逻辑
//
this.Title = "通信訂閱者";
this.TitleIconImageUrl = ""; } private int _empID;
private GridView gv = new GridView();
private AccessDataSource ads; //實現控件用戶界面
protected override void RenderContents(HtmlTextWriter writer)
{
//if (_empID < 1)
//{
// writer.Write("<span style='color:gray'>請在文本框中輸入大於等于1的值</span>");
// return;
//}
//else
//{
ads = new AccessDataSource();
ads.ID = "accessDataSource1";
ads.DataFile = "~/App_Data/Nwind.mdb";
ads.SelectCommand = "select top 8 orderid,customerid,employeeid,orderdate from orders where employeeid=" + _empID.ToString();
Controls.Add(ads);
gv = new GridView();
gv.DataSourceID = "accessDataSource1";
gv.CellPadding = 3;
gv.GridLines = GridLines.None;
gv.BorderWidth = 0;
Controls.Add(gv);
gv.RenderControl(writer); //}
//base.RenderContents(writer);
}
//
[ConnectionConsumer("EmployeeIDConsumer", "EmployeeIDConsumer")]
public void GetEmployeeInfo(IEmployeeInfo empInfo)
{
if (empInfo != null)
{
_empID = empInfo.EmployeeID;
}
else
{
throw new NotSupportedException("未能連接ACCESS數據庫。");
} } }}
主程序
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
protected void Button1_Click(object sender, EventArgs e)
{
WebPartManager1.DisplayMode = WebPartManager.BrowseDisplayMode;
}
protected void Button2_Click(object sender, EventArgs e)
{
WebPartManager1.DisplayMode = WebPartManager.ConnectDisplayMode;
}
}
動態測試畫面(此為為看到謂詞而添加的登陸界面)
單擊“連接”進入連接模式單擊“通信提供者”謂詞(connection)至此,“通信訂閱者”為何沒有呈現呢?為何CONNECTIONSZONE組件提示沒有活動連接呢?請高手指教。