Asp.net 如何将变量传递给用户控件以用作sqldatasource的selectcommand
我不明白为什么我的usercontrol中的属性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
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。。。。