2

我在 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 类型,并且尝试将 sender 强制转换为 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 属性,但这是不同的。有谁知道在处理该事件时是否可以获得触发 Selecting 事件的 DataSource 的 ID?如果是这样,您能否举例说明如何执行此操作?

谢谢!

4

2 回答 2

0

这有点骇人听闻,但它有效。为每个 SqlDataSource 提供一个名称相同但默认值不同的其他未使用的 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;
    }

希望有人有更好的解决方案。

于 2011-04-13T17:09:14.837 回答
0

我还没有尝试过,但是 SqlDataSource 具有GetViewNames()方法,也许您可​​以获取 DataSources 的 ViewNames 并检查哪个具有当前SqlDataSourceView.Name.

于 2011-03-11T02:23:28.120 回答