如何在基于 ASPxGridView 的用户控件中参数化数据源?
How to parametrize datasource in the user control based on ASPxGridView?
总结:同一个用户控件在ASPxGridView嵌套的不同层级显示注释。如何参数化用户控件?
详细信息: 我想显示 Projects 的 ASPxGridView。项目的每个 DetailRow 显示带有 Milestones 的嵌套 ASPxGridView 和同一级别(在同一 DetailRow 内)的另一个 ASPxGridView Notes。
里程碑网格视图行也可以展开以显示详细信息。里程碑的详细信息还包含 Notes -- 在不同的嵌套级别。见图:
绿框 ASPxGridView 及其 SqlDataSource(名为 dsNotes
)是名为 NotesControl
的用户控件。
上层NotesControl
显示项目和所有项目里程碑的注释的联合。如果用户需要,he/she 可以展开里程碑以仅查看与里程碑相关的注释。
NotesControl
的 SqlDataSource 使用带有参数 @idproj
和 @idmilestone
的存储过程 sp_notes
。默认值 -1
表示参数不适用。这样 sp_notes
可以 return 或所有项目的所有注释,给定项目(即项目及其里程碑)的所有注释,或仅给定的里程碑注释。
需要知道:我应该如何正确地将idproj
和idmilestone
传递给NotesControl
用户组件?
我尝试了什么: 早些时候,我的 NotesControl
使用 ..._BeforePerformDataSelect
事件处理程序来填充 Session["idproj"]
和 Session["idmilestone"]
。 dsNotes
的 SqlDataSource 参数绑定到会话。但是,Session
查找 table 是全局的,它无法存储 NotesControl
.
的单独实例的参数值
推荐的方法是什么?可能有一些替代方案?
更新:采纳建议引入名为ProjectID
和MilestoneID
的NotesControl
-class属性,并具有NotesControl.ascx
中 dsNotes
数据源的以下定义...我可以修改 HTML 片段,使其以某种方式传递 属性 值吗?
<asp:SqlDataSource ID="dsNotes" runat="server" ConnectionString="<%$ ConnectionStrings:app_db_ConnectionString %>" SelectCommand="sp_notes" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:SessionParameter DefaultValue="" Name="idproj" SessionField="idproj" Type="Int32" />
<asp:SessionParameter DefaultValue="" Name="idmilestone" SessionField="idmilestone" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
您需要在用户控件中创建两个 public 属性。
然后在您想要访问用户控件时设置它们,然后使用该属性绑定 datasource
.
示例-
namespace projects.WebApplication.mySystem.Controls
{
public partial class myusercontrol: System.Web.UI.UserControl
{
public event EventHandler Close;
public event EventHandler Show;
public int MilestoneID{get;set;}
public int ProjectID{get;set;}
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
yourgridview.Datasource= MyDatabaseHelper.GetGridData(MilestoneID,ProjectID);
yourgridview.DataBind();
}
}
}
}
更新
有两种方法可以达到你想要的效果
1) 按照您当前的 HTML 代码并使用会话变量,只需更新属性集中的会话变量
private int _mileStoneID = int.MinValue;
public int MilestoneID{get{return _mileStoneID;}set{
Session["idmilestone"] = value;
_mileStoneID = value;
}}
对另一个做同样的事情 属性
2) 您可以如下更改 ASP 标签脚本代码,
<SelectParameters>
<asp:Parameter Name="MilestoneID" Type="Int32" DefaultValue=0/>
<asp:Parameter Name="ProjectID" Type="Int32" DefaultValue=0/>
</SelectParameters>
然后在 pageload
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
dsNotes.SelectParameters["MilestoneID"].DefaultValue = MilestoneID.ToString();
dsNotes.SelectParameters["ProjectID"].DefaultValue = ProjectID.ToString();
}
}
注意 - 代码未经测试,可能需要根据需要进行调整。
总结:同一个用户控件在ASPxGridView嵌套的不同层级显示注释。如何参数化用户控件?
详细信息: 我想显示 Projects 的 ASPxGridView。项目的每个 DetailRow 显示带有 Milestones 的嵌套 ASPxGridView 和同一级别(在同一 DetailRow 内)的另一个 ASPxGridView Notes。
里程碑网格视图行也可以展开以显示详细信息。里程碑的详细信息还包含 Notes -- 在不同的嵌套级别。见图:
绿框 ASPxGridView 及其 SqlDataSource(名为 dsNotes
)是名为 NotesControl
的用户控件。
上层NotesControl
显示项目和所有项目里程碑的注释的联合。如果用户需要,he/she 可以展开里程碑以仅查看与里程碑相关的注释。
NotesControl
的 SqlDataSource 使用带有参数 @idproj
和 @idmilestone
的存储过程 sp_notes
。默认值 -1
表示参数不适用。这样 sp_notes
可以 return 或所有项目的所有注释,给定项目(即项目及其里程碑)的所有注释,或仅给定的里程碑注释。
需要知道:我应该如何正确地将idproj
和idmilestone
传递给NotesControl
用户组件?
我尝试了什么: 早些时候,我的 NotesControl
使用 ..._BeforePerformDataSelect
事件处理程序来填充 Session["idproj"]
和 Session["idmilestone"]
。 dsNotes
的 SqlDataSource 参数绑定到会话。但是,Session
查找 table 是全局的,它无法存储 NotesControl
.
推荐的方法是什么?可能有一些替代方案?
更新:采纳建议引入名为ProjectID
和MilestoneID
的NotesControl
-class属性,并具有NotesControl.ascx
中 dsNotes
数据源的以下定义...我可以修改 HTML 片段,使其以某种方式传递 属性 值吗?
<asp:SqlDataSource ID="dsNotes" runat="server" ConnectionString="<%$ ConnectionStrings:app_db_ConnectionString %>" SelectCommand="sp_notes" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:SessionParameter DefaultValue="" Name="idproj" SessionField="idproj" Type="Int32" />
<asp:SessionParameter DefaultValue="" Name="idmilestone" SessionField="idmilestone" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
您需要在用户控件中创建两个 public 属性。
然后在您想要访问用户控件时设置它们,然后使用该属性绑定 datasource
.
示例-
namespace projects.WebApplication.mySystem.Controls
{
public partial class myusercontrol: System.Web.UI.UserControl
{
public event EventHandler Close;
public event EventHandler Show;
public int MilestoneID{get;set;}
public int ProjectID{get;set;}
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
yourgridview.Datasource= MyDatabaseHelper.GetGridData(MilestoneID,ProjectID);
yourgridview.DataBind();
}
}
}
}
更新
有两种方法可以达到你想要的效果
1) 按照您当前的 HTML 代码并使用会话变量,只需更新属性集中的会话变量
private int _mileStoneID = int.MinValue;
public int MilestoneID{get{return _mileStoneID;}set{
Session["idmilestone"] = value;
_mileStoneID = value;
}}
对另一个做同样的事情 属性
2) 您可以如下更改 ASP 标签脚本代码,
<SelectParameters>
<asp:Parameter Name="MilestoneID" Type="Int32" DefaultValue=0/>
<asp:Parameter Name="ProjectID" Type="Int32" DefaultValue=0/>
</SelectParameters>
然后在 pageload
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
dsNotes.SelectParameters["MilestoneID"].DefaultValue = MilestoneID.ToString();
dsNotes.SelectParameters["ProjectID"].DefaultValue = ProjectID.ToString();
}
}
注意 - 代码未经测试,可能需要根据需要进行调整。