同时使用Telerik RadGrid's OnRowClick以及自定义用户控制事件处理程序
本文关键字:OnRowClick 自定义 用户 程序 事件处理 控制 Telerik RadGrid | 更新日期: 2023-09-27 18:12:59
我在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";
}