我在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;
}
答案 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";
}