我在asp.net页面上有几个不同的sqldatasources,它们都在onSelecting事件处理程序上触发。这样做的原因是因为事件处理程序中的相同代码可以应用于所有数据源(这实际上是动态地在查询中生成过滤器)。但是,现在我有另一个数据源仍然可以使用大部分代码,但需要处理稍微不同。如果我可以引用触发事件的数据源ID(我已经尝试过),我可以很容易地做到这一点,但这似乎不可能。这是我最初尝试做的事情:
protected void sdsTable_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
SqlDataSource sds = sender as SqlDataSource;
string dsID = sds == null ? "" : sds.ID;
if (dsID == "aDataSourceID")
{
//do this
}
else
{
//do that
}
//more code
}
这不起作用,因为sender是SqlDataSourceView类型并尝试转发发件人,因为SqlDataSource返回null。所以,我把它改成了SqlDataSourceView:
protected void sdsTable_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
SqlDataSourceView sds = sender as SqlDataSourceView;
string dsID = sds == null ? "" : sds.Name; //Tried Name property because ID isn't available
if (dsID == "aDataSourceID")
{
//do this
}
else
{
//do that
}
//more code
}
但这仍然无效。 SqlDataSourceView似乎没有可用的属性,它提供当前触发事件的数据源的datasourceID。有一个SqlDataSourceView.Name属性,但这是不同的东西。有人知道在处理该事件时是否有可能获取DataSource的ID触发Selecting事件?如果是这样,你能提供一个如何做到这一点的例子吗?
谢谢!
答案 0 :(得分:0)
我没有尝试过这个,但是SqlDataSource有GetViewNames()方法,也许你可以获取数据源的ViewNames并检查哪一个有当前的SqlDataSourceView.Name
。
答案 1 :(得分:0)
这有点hackish,但它的确有效。为每个SqlDataSources提供一个原本未使用的SelectParameter,它具有相同的名称,但默认值不同。例如,可能有:
<asp:Parameter DefaultValue="Value1" Name="sdsName" Type="String" />
另一个可能有:
<asp:Parameter DefaultValue="Value2" Name="sdsName" Type="String" />
然后在选择事件上,您可以执行以下操作:
switch (e.Command.Parameters["@sdsName"].Value.ToString())
{
case "Value1":
//Do something!
break;
case "Value2":
//Do something!
break;
}
这是希望有人有更好的解决方案。