1

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

我还有一个名为 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;
}
4

2 回答 2

1

由于您想要 UC/Page 中的服务器事件,因此您需要发布页面以获取它们。网格的客户端 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";
}
于 2014-07-22T09:34:54.360 回答
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);
}
于 2014-07-14T23:46:30.580 回答