【问题标题】:how to pass a variable to a user control to be used as selectcommand of sqldatasource如何将变量传递给用户控件以用作 sqldatasource 的 selectcommand
【发布时间】:2014-01-02 00:16:59
【问题描述】:

我不明白为什么我的用户控件中的属性ParentScheduleItemId 总是为零。我要做的就是将一个值传递给我的用户控件,以便它可以用作 SqlDataSource 中选择命令的选择参数。我有下面的代码,这似乎导致ParentScheduleItemId == 0,但它实际上打印了我在ascx文件中传递它的预期非零值,就在句子No data was returned旁边:

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>

所以我想做的就是做一些类似&lt;usercontrol:mylistview ParentScheduleItemId=24&gt; 的事情,然后将 24 用作我的 SelectCommand 的一部分。我如何做到这一点?

注意 - 你会注意到我注释掉了 SqlDataSource1.SelectParameters.Add("ParentScheduleItemId", "12"); 行。如果我取消注释它,它实际上会按预期运行,并为我的选择参数提供数字 12,并且 sqldatasource 为我提供我想要的值。我只是不明白为什么它上面的行有一个 ParentScheduleItemId == 0。这与页面加载周期有关吗?无论如何,我只想将正确的 parentscheduleitemid 传递给我的选择命令。

【问题讨论】:

  • 在`set处设置断点; }` 和SqlDataSource1.SelectParameters.Add("ParentScheduleItemId", ParentScheduleItemId.ToString());,看看哪个先命中。
  • 我已经确认页面加载在 ParentScheduleItemId 的 setter 函数之前触发。所以现在我不确定如何/何时将变量传递给我的 selectcommand....

标签: asp.net user-controls sqldatasource


【解决方案1】:

好吧,这很令人沮丧。在我的头撞到墙上 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 甚至被设置之前运行......

【讨论】:

    猜你喜欢
    • 2010-10-03
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2023-03-17
    相关资源
    最近更新 更多