如何获取触发 onSelecting 事件的数据源的 datasourceID?

Posted

技术标签:

【中文标题】如何获取触发 onSelecting 事件的数据源的 datasourceID?【英文标题】:How do I get the datasourceID of the datasource that is firing the onSelecting event? 【发布时间】:2011-07-13 04:44:03 【问题描述】:

我在 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?如果是这样,你能提供一个如何做到这一点的例子吗?

谢谢!

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢您的输入 :) 该方法受到保护,所以我认为为了能够调用它,我需要创建一种继承 sqldatasource 控件并允许一种方式的新型控件引用该方法。我有一种预感,SqlDataSourceView.Name(公共属性)可能会调用 GetView(),这也是一种受保护的方法。问题是,附加到选择事件的每个数据源都为该属性返回“DefaultView”...我不确定是否有办法使 SqlDataSource 的视图名称唯一...【参考方案2】:

这有点骇人听闻,但它确实有效。为每个 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;
    

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

【讨论】:

以上是关于如何获取触发 onSelecting 事件的数据源的 datasourceID?的主要内容,如果未能解决你的问题,请参考以下文章

Onselect 事件不会在 div 上触发

JS事件 内容选中事件(onselect)选中事件,当文本框或者文本域中的文字被选中时,触发onselect事件,同时调用的程序就会被执行。

jquery datepicker onselect 事件处理程序多次

easyui combobox setValue方法不能触发onSelect事件

p:日历 onselect/onchange 未触发

easyui 复选框 onClickRow事件与onSelect事件与onCheck事件