Asp.net 如何将变量传递给用户控件以用作sqldatasource的selectcommand

Asp.net 如何将变量传递给用户控件以用作sqldatasource的selectcommand,asp.net,user-controls,sqldatasource,Asp.net,User Controls,Sqldatasource,我不明白为什么我的usercontrol中的属性ParentScheduleItemId总是零。我所要做的就是将一个值传递给我的用户控件,以便它可以用作SqlDataSource中selectcommand的selectparameter。我有下面的代码,这似乎导致了ParentScheduleItemId==0,但它实际上打印了我在ascx文件中传递的预期非零值,就在句子的旁边,没有返回任何数据: namespace CCApplication.Cms { public partial

我不明白为什么我的usercontrol中的属性
ParentScheduleItemId
总是零。我所要做的就是将一个值传递给我的用户控件,以便它可以用作SqlDataSource中selectcommand的selectparameter。我有下面的代码,这似乎导致了
ParentScheduleItemId==0
,但它实际上打印了我在ascx文件中传递的预期非零值,就在句子
的旁边,没有返回任何数据

namespace CCApplication.Cms
{
    public partial class schedule_sub_item : System.Web.UI.UserControl
    {
        public int ParentScheduleItemId {
            get;

            set; }

        protected void Page_Load(object sender, EventArgs e)
        {
            SqlDataSource1.SelectParameters.Add("ParentScheduleItemId", ParentScheduleItemId.ToString());
            //SqlDataSource1.SelectParameters.Add("ParentScheduleItemId", "12");
        }
    }
}
我在ascx文件中有以下代码

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:NewConferencesApplicationConnectionString %>" 
            SelectCommand="
SELECT [ScheduleItemId],[ParentScheduleItemId],[Name],[Type],[Location],[MaximumUsers],[CompanionAllowed],[StartTime],[EndTime]
FROM [Conferences_ScheduleItem]
WHERE ParentScheduleItemId = @ParentScheduleItemId
ORDER BY StartTime;
            "
            DeleteCommand="DELETE FROM [Conferences_ScheduleItem] WHERE [ScheduleItemId] = @ScheduleItemId"
            >
        </asp:SqlDataSource>


        <asp:ListView ID="ListView1" runat="server" DataKeyNames="ScheduleItemId" 
            DataSourceID="SqlDataSource1">
            <EmptyDataTemplate>
                <table id="Table1" runat="server" style="">
                    <tr>
                        <td>
                            No data was returned.<% Response.Write(ParentScheduleItemId.ToString()); %></td>
                    </tr>
                </table>
            </EmptyDataTemplate>
            <ItemTemplate>
                <tr style="">
                    <td>
                        <asp:Label ID="ScheduleItemIdLabel" runat="server" 
                            Text='<%# Eval("ScheduleItemId") %>' />
                    </td>

                </tr>
            </ItemTemplate>
            <LayoutTemplate>
                <table id="Table2" runat="server">
                    <tr id="Tr1" runat="server">
                        <td id="Td1" runat="server">
                            <table ID="itemPlaceholderContainer" runat="server" border="0" style="">
                                <tr ID="itemPlaceholder" runat="server">
                                </tr>
                            </table>
                        </td>
                    </tr>
                    <tr id="Tr3" runat="server">
                        <td id="Td2" runat="server" style="">
                        </td>
                    </tr>
                </table>
            </LayoutTemplate>
        </asp:ListView>

没有返回任何数据。
因此,我只想做一些类似于
的事情,然后将24用作SelectCommand的一部分。我如何做到这一点


注意-您会注意到我注释掉了行
SqlDataSource1.SelectParameters.Add(“ParentScheduleItemId”,“12”)。如果我取消对它的注释,它的行为实际上与预期的一样,并为我的select参数提供数字12,sqldatasource为我提供所需的值。我只是不明白为什么它上面的行有ParentScheduleItemId==0。这是否与页面加载周期有关?无论如何,我只想将正确的parentscheduleitemid传递给我的select命令。

好,这很令人沮丧。我用头撞了3个小时后找到了解决办法。以下是工作代码:

//代码隐藏

namespace CCApplication.Cms
{

public partial class schedule_sub_item : System.Web.UI.UserControl
{
    public string _parentScheduleItemId;
    public string ParentScheduleItemId {
        get
        {
            return _parentScheduleItemId;
        }
        set
        {
            _parentScheduleItemId = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void UpdateSqlParametersEventHandler(object sender, SqlDataSourceSelectingEventArgs e)
    {
        System.Data.Common.DbParameter param = e.Command.CreateParameter();
        param.ParameterName = "@ParentScheduleItemId";
        param.Value = this._parentScheduleItemId;
        e.Command.Parameters.Add(param);
    }
}
}
//前端代码

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:NewConferencesApplicationConnectionString %>" 
OnSelecting="UpdateSqlParametersEventHandler"
            SelectCommand="
SELECT [ScheduleItemId],[ParentScheduleItemId],[Name],[Type],[Location],[MaximumUsers],[CompanionAllowed],[StartTime],[EndTime]
FROM [Conferences_ScheduleItem]
WHERE ParentScheduleItemId = @ParentScheduleItemId
ORDER BY StartTime;
            "
            DeleteCommand="DELETE FROM [Conferences_ScheduleItem] WHERE [ScheduleItemId] = @ScheduleItemId"
            >
    </asp:SqlDataSource>


    <asp:ListView ID="ListView1" runat="server" DataKeyNames="ScheduleItemId" 
        DataSourceID="SqlDataSource1">
        <EmptyDataTemplate>
            <table id="Table1" runat="server" style="">
                <tr>
                    <td>
                        No data was returned.<% Response.Write(ParentScheduleItemId.ToString()); %></td>
                </tr>
            </table>
        </EmptyDataTemplate>
        <ItemTemplate>
            <tr style="">
                <td>
                    <asp:Label ID="ScheduleItemIdLabel" runat="server" 
                        Text='<%# Eval("ScheduleItemId") %>' />
                </td>

            </tr>
        </ItemTemplate>
        <LayoutTemplate>
            <table id="Table2" runat="server">
                <tr id="Tr1" runat="server">
                    <td id="Td1" runat="server">
                        <table ID="itemPlaceholderContainer" runat="server" border="0" style="">
                            <tr ID="itemPlaceholder" runat="server">
                            </tr>
                        </table>
                    </td>
                </tr>
                <tr id="Tr3" runat="server">
                    <td id="Td2" runat="server" style="">
                    </td>
                </tr>
            </table>
        </LayoutTemplate>
    </asp:ListView>

没有返回任何数据。
因此,基本上我需要添加一个OnSelecting=“UpdateSqlParametersEventHandler”,然后在代码中添加该函数来设置参数


我以前遇到问题的原因是页面加载循环导致sqldatasource在设置ParentScheduleItemId之前运行…

在'set;}'设置断点和
SqlDataSource1.SelectParameters.Add(“ParentScheduleItemId”,ParentScheduleItemId.ToString()),查看哪个先命中。我已确认pageload在ParentScheduleItemId的setter函数之前触发。因此,现在我不确定如何/何时将变量传递给selectcommand。。。。