同时使用Telerik RadGrid的OnRowClick以及自定义用户控件事件处理程序

时间:2014-07-14 22:29:27

标签: c# asp.net user-controls telerik eventhandler

我在C#中的Web用户控件中填充了Telerik RadGrid,并且它在我的用户控件的客户端Javascript中发生了客户端OnRowClick事件。这很好用。

我还有一个名为ControlClick的事件,它与我想在Web窗体上触发的用户控件相关联。 ControlClick绑定在我的UserControl的CodeBehind到OnControlClick,然后绑定到我的Web窗体中的用户控件。

OnRowClick事件不会触发任何问题,但ControlClick事件永远不会触发,所以我从不进入我的Web窗体函数,该函数在单击RadGrid中的某些内容时处理行为。

我不确定我是否错误地实现了我的事件,或者它是否与我已经将点击行为绑定到RadControl的事实有关。有人有什么想法吗?

干杯!

代码段

RadGrid东西:

<rad:RadGrid ID="gridRequests" EnableViewState="true" runat="server"  OnNeedDataSource="gridRequests_NeedDataSource" OnItemDataBound="gridRequests_DataBound">
    <MasterTableView>
        <Columns>
            <!-- The Column Stuff -->
        </Columns>
    </MasterTableView>
    <ClientSettings EnableRowHoverStyle="true">
        <ClientEvents OnRowClick="RowClickEvent" />
    </ClientSettings>
</rad:RadGrid>

在我的UserControl的CodeBehind中:

public event EventHandler ControlClick;
protected void OnControlClick(object sender, EventArgs e){
    ControlClick(sender, e);
    FilterId = Utils.NullSafeInt32(hdnFilterId.Value);
}

在我的主页标记中

 <ft:UserControl ID="ftUserControlInstance" runat="server" SharePoint="false" Visible="true" OnControlClick="ControlClick"/>

在我的主页CodeBehind:

public void DRFGetQueryStrings(object sender, EventArgs e)
{
    Mobile_WebControls_UserControlInstance getControl = (Mobile_WebControls_UserControlInstance)ftUserControlInstance;

    _filterId = getControl.FilterId;

    ScriptManager.RegisterStartupScript(this, this.GetType(), "script", "requestFulfillment()", true);
}

编辑:这是我的RowClickEvent:

function RowClickEvent(sender, eventArgs) {
        var filterId = eventArgs.getDataKeyValue('FilterID');
        document.getElementById("<%=hdnFilterId.ClientID %>").value = filterId;
}

2 个答案:

答案 0 :(得分:1)

您的RowClickEvent正在接受此活动,并且没有冒泡到postback

第一步是从你的函数中返回true

function RowClickEvent(sender, eventArgs) {
        var filterId = eventArgs.getDataKeyValue('FilterID');
        document.getElementById("<%=hdnFilterId.ClientID %>").value = filterId;
        return true;
}

这应该确保事件继续并且两者都运行。

如果您仍然遇到问题,可以在javascript中调用回发。

function RowClickEvent(sender, eventArgs) {
        var filterId = eventArgs.getDataKeyValue('FilterID');
        document.getElementById("<%=hdnFilterId.ClientID %>").value = filterId;
         __doPostBack('__Page', 'MyCustomArgument');
}

MyCustomArgument可以是空字符串。

要以Telerik方式执行此操作,您将使用set_cancel方法:

function RowClickEvent(sender, eventArgs) {
        var filterId = eventArgs.getDataKeyValue('FilterID');
        document.getElementById("<%=hdnFilterId.ClientID %>").value = filterId;
        eventArgs.set_cancel(false);
}

答案 1 :(得分:1)

由于您需要UC / Page中的服务器事件,因此您需要POST页面才能获取它们。网格的客户端RowClick事件本身不会触发自定义服务器事件。 您还可以考虑使用网格的服务器SelectedIndexChanged事件来触发自定义事件,而不是使用一些自定义参数引发回发。您也可以使用AJAX来避免处理整个页面。

这是一个非常简单的示例(请注意,将RadAjaxManager添加到用户控件不是一个好主意,但您可以以编程方式或以其他方式创建AJAX设置):

            <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server">
            <AjaxSettings>
                <telerik:AjaxSetting AjaxControlID="RadGrid1">
                    <UpdatedControls>
                        <telerik:AjaxUpdatedControl ControlID="RadGrid1" />
                    </UpdatedControls>
                </telerik:AjaxSetting>
            </AjaxSettings>
        </telerik:RadAjaxManager>
        <telerik:RadGrid ID="RadGrid1" runat="server" OnSelectedIndexChanged="RadGrid1_SelectedIndexChanged" OnNeedDataSource="RadGrid1_OnNeedDataSource">
            <ClientSettings Selecting-AllowRowSelect="true" EnablePostBackOnRowClick="true">
                <ClientEvents OnRowClick="doSomeClientWork" />
            </ClientSettings>
        </telerik:RadGrid>
        <script type="text/javascript">
            function doSomeClientWork(sender, eventArgs) {
                var filterId = eventArgs.getDataKeyValue('FilterID');
                alert(filterId);
            }
        </script>



    protected void RadGrid1_SelectedIndexChanged(object sender, EventArgs e)
{
    GridDataItem item = (GridDataItem)RadGrid1.SelectedItems[0];//get selected row
    //make sure you pass the apporpriate arguments, sender is the grid already
    ControlClick(sender, e);
}

protected void RadGrid1_OnNeedDataSource(object sender, GridNeedDataSourceEventArgs e)
{
    RadGrid1.DataSource = "asdfg";
}