在GridView单元格上单击调用JavaScript函数

时间:2017-05-16 14:16:08

标签: javascript asp.net gridview devexpress

我有一个DevExpress gridview,其中包含以下设置。

settings.Name = "DetailGridView";

// this calls DetailGridView.StartEditRow() on client side
settings.ClientSideEvents.RowClick = "Fn.startEditingRow";
settings.SettingsEditing.Mode = DevExpress.Web.GridViewEditingMode.Inline;

为了简单起见,我删除了许多其他设置,但询问您是否认为我需要显示其他相关设置。

现在我想在每次单元格点击时调用JavaScript函数。为此,我已根据this SO answerthis DevExpress thread

添加了此设置
settings.HtmlDataCellPrepared += (sender, e) =>
{
    string onClickFunctionJS = "Fn.DetailOnlyOnCellClick({0},'{1}');";
    e.Cell.Attributes.Add("onclick", String.Format(onClickFunctionJS, e.VisibleIndex, e.DataColumn.FieldName));
};

JS函数Fn.DetailOnlyOnCellClick()打印以控制字段名称的值(第二个参数)。但它只在第一次单击该行时打印单击的单元格的字段名称。之后,单击所选行中的另一个单元格不再触发函数Fn.DetailOnlyOnCellClick()。我观察到,如果我关闭ClientSideEvents.RowClick,它可以正常工作,但由于其他原因我无法将其关闭。如何在保持ClientSideEvents.RowClick的同时获取用户点击的单元格?

1 个答案:

答案 0 :(得分:0)

感谢DevExpress支持中心解决了我的问题。首先,我无法使用settings.HtmlDataCellPrepared,因为正如我在问题中所提到的,网格视图在单击行时进入编辑模式,而在编辑模式settings.HtmlDataCellPrepared不应该按照我的方式工作需要它为我的情况。所以我开始使用这段代码:

settings.CellEditorInitialize = (s, e) =>
{
    var elementEditor = e.Editor;
    string onClickFunctionJS = "DetailOnlyOnCellClick({0},'{1}');";
    DevExpress.Web.Rendering.GridViewTableInlineEditorCell cell = 
        elementEditor.Parent as DevExpress.Web.Rendering.GridViewTableInlineEditorCell;

    cell.Attributes.Add("onclick",
        String.Format(onClickFunctionJS, e.VisibleIndex, e.Column.FieldName));
};

此代码适用于每个不同的控件。唯一的问题是当该字段是一个复选框并且该单元格被禁用时。为了解决这个问题,我已将此代码用于复选框控件:

string func = String.Format(
    "ASPxClientUtils.AttachEventToElement(s.GetMainElement(), 'click', function() {{ {0} }} )",
        String.Format(onClickFunctionJS, e.VisibleIndex, e.Column.FieldName));

(elementEditor as ASPxCheckBox).ClientSideEvents.Init = String.Format("function(s,e){{ {0}; }}", func);

此代码完美无缺。

使用两种方法的链接:

P.S。:我在这里展示的这些方法都来自DevExpress专家,我从DevExpress的支持中心得到了这些答案。一旦我能用许可证解决问题并且票证公开,我将提供我的问题的链接。