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



我在c#的Web用户控件中填充了一个Telerik RadGrid,并且它有一个客户端OnRowClick事件,该事件在我的用户控件的客户端用Javascript发生。这工作得很好。

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

OnRowClick事件触发没有问题,但ControlClick事件从未触发,所以我从来没有进入我的Web Form函数处理行为时,我的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>

In CodeBehind of my UserControl:

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"/>

In my Main Page 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;
}

您的RowClickEvent正在接收事件,而postback没有冒泡

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

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

这将确保事件继续并且两个事件都运行。

如果你仍然有问题,你可以在javascript中调用postback。

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);
}

因为您想要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";
}

最新更新