如何在基于 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 或所有项目的所有注释,给定项目(即项目及其里程碑)的所有注释,或仅给定的里程碑注释。

需要知道:我应该如何正确地将idprojidmilestone传递给NotesControl用户组件?

我尝试了什么: 早些时候,我的 NotesControl 使用 ..._BeforePerformDataSelect 事件处理程序来填充 Session["idproj"]Session["idmilestone"]dsNotes 的 SqlDataSource 参数绑定到会话。但是,Session 查找 table 是全局的,它无法存储 NotesControl.

的单独实例的参数值

推荐的方法是什么?可能有一些替代方案?

更新:采纳建议引入名为ProjectIDMilestoneIDNotesControl-class属性,并具有NotesControl.ascxdsNotes 数据源的以下定义...我可以修改 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();
        }
    }

注意 - 代码未经测试,可能需要根据需要进行调整。