从GridButtonColumn启动编辑表单

时间:2011-11-01 21:00:40

标签: c# asp.net ajax telerik radgrid

我有一个类,它定义了我将在应用程序范围内使用的Hierarchical RadGrid。这个网格有很多列,所以这对我来说是最好的实现,因为我将覆盖基于网格的om实现的特定特性。

网格将根据用户的访问级别以不同的方式运行。在“基本用户级别”,他们将在父网格上添加新项目/编辑项目,并在子网格上编辑,拒绝(删除),批准(更新)

下一级将是“审批者”角色。他们不会在父网格上添加新项/编辑项,并且只会在子项上使用拒绝(编辑)。拒绝项目时用户将在此角色中执行的编辑操作是,他们将需要通过单击拒绝按钮时将启动的用户控件输入注释。我遇到的问题是当使用GridButtonColumn作为触发事件时,自定义用户控件不显示DetailTableView.EditFormSettings。有什么想法吗? TIA

private void SubmittedBatchesRadGrid_ItemDataBound(object sender, GridItemEventArgs e)
{
    GridDataItem _dataItem = e.Item as GridDataItem;
    if (_dataItem == null) return;

    if (e.Item.OwnerTableView.Name == "SubmittedBatchesRadGrid_ChildGrid")
    {
        SetChildGridCommandColumns(sender, e);
        return;
    }

    if (_dataItem.KeyValues == "{}") { return; }

    SetMasterGridCommandColumns(sender, e, _dataItem);

}

private static void SetChildGridCommandColumns(object sender, GridItemEventArgs e)
{
    const string _jqueryCode = "if(!$find('{0}').confirm('{1}', event, '{2}'))return false;";
    const string _confirmText = "<p>Rejecting this adjustment will mean that you will have to also reject the batch when you are done processing these items.</p><p>Are you sure you want to reject this adjustment?</p>";
    ((ImageButton)(((GridEditableItem)e.Item)["PolicyEditRecord"].Controls[0])).ImageUrl = "/controls/styles/images/editpencil.png";
    ImageButton _btnReject = (ImageButton)((GridDataItem)e.Item)["DeleteTransaction"].Controls[0];

    _btnReject.CommandName = "Update";
    _btnReject.ImageUrl = "/controls/styles/images/decline.png";
    _btnReject.ToolTip = "Reject this item";
    //_btnReject.Attributes["onclick"] = string.Format(_jqueryCode, ((Control)sender).ClientID, _confirmText, "Reject Adjustment");
}

private void SubmittedBatchesRadGrid_DetailTableDataBind(object sender, GridDetailTableDataBindEventArgs e)
{
    e.DetailTableView.EditFormSettings.EditFormType = GridEditFormType.WebUserControl;
    e.DetailTableView.EditFormSettings.UserControlName = "/Controls/RejectedAdjustmentComment.ascx";
    e.DetailTableView.EditMode = GridEditMode.PopUp;

    e.DetailTableView.CommandItemSettings.ShowAddNewRecordButton = false;
    GridDataItem _dataItem = e.DetailTableView.ParentItem;
    e.DetailTableView.DataSource = AdjustmentAPI.GetAdjustmentsByBatch(Convert.ToInt32(_dataItem.GetDataKeyValue("BatchID").ToString()), PolicyClaimManualAdjustmentCode);
}

2 个答案:

答案 0 :(得分:0)

看起来您只需要使用OnClientClick,然后返回确认对话框的值。

_btnReject.OnClientClick = "return confirm(\"Are you sure you?\");"

RadAjax在确认对话框方面有一点点怪癖,所以你可能需要改用它:

_btnReject.OnClientClick = "if (!confirm(\"Are you sure?\")) return false;"

答案 1 :(得分:0)

所以我想我会分享我的解决方案以防其他人需要它。

我正在用编辑控件咆哮错误的树。即使注释是RadGrid中数据集的一部分,我也不想编辑现有记录。我决定创建一个usercontrol来处理这个过程。 RadWindow不直接使用.ascx页面,所以我开始使用.aspx包装页面并在那里插入控件。然后我更改了OnClientClick事件以启动RadWindow加载新的aspx文件,将我需要的参数传递给usercontrol。 usercontrol将注释保存到数据库并更新记录状态,然后关闭。

我从上面修改了这一部分:

    private static void SetChildGridCommandColumns(object sender, GridItemEventArgs e)
    {
        ((ImageButton)(((GridEditableItem)e.Item)["PolicyEditRecord"].Controls[0])).ImageUrl = "/controls/styles/images/editpencil.png";
        ImageButton _btnReject = (ImageButton)((GridDataItem)e.Item)["DeleteTransaction"].Controls[0];
        int _manualAdjustmentId = Convert.ToInt32(((GridDataItem)e.Item)["ManualAdjustmentId"].Text);
        int _manualAdjustmentBatchId = Convert.ToInt32(((GridDataItem)e.Item)["ManualAdjustmentBatchId"].Text);

        _btnReject.ImageUrl = "/controls/styles/images/decline.png";
        _btnReject.ToolTip = "Reject this item";
        _btnReject.OnClientClick = String.Format("OpenRadWindow('/controls/RejectedAdjustmentComment.aspx?manualAdjustmentId={0}&manualAdjustmentBatchId={1}', 'CommentDialog');return false;", _manualAdjustmentId, _manualAdjustmentBatchId);
    }

    private void SubmittedBatchesRadGrid_DetailTableDataBind(object sender, GridDetailTableDataBindEventArgs e)
    {
//I deleted this section
        e.DetailTableView.EditFormSettings.EditFormType = GridEditFormType.WebUserControl;
        e.DetailTableView.EditFormSettings.UserControlName = "/Controls/RejectedAdjustmentComment.ascx";
        e.DetailTableView.EditMode = GridEditMode.PopUp;
//

        e.DetailTableView.CommandItemSettings.ShowAddNewRecordButton = false;
        GridDataItem _dataItem = e.DetailTableView.ParentItem;
        e.DetailTableView.DataSource = AdjustmentAPI.GetAdjustmentsByBatch(Convert.ToInt32(_dataItem.GetDataKeyValue("BatchID").ToString()), PolicyClaimManualAdjustmentCode);
    }

我将其添加到包含datagrid的页面:

<telerik:RadWindowManager ID="SubmittedBatchesWindow" runat="server">
    <windows>
            <telerik:RadWindow ID="CommentDialog" runat="server" Title="Rejected Agjustment Comment Dialog"
                Height="350px" Width="440" Left="250px" ReloadOnShow="false" ShowContentDuringLoad="false"
                Modal="true" VisibleStatusbar="false" />
        </windows>
</telerik:RadWindowManager>

我创建了一个新的aspx文件并在

中插入了新的ascx控件
<form id="form1" runat="server">
<telerik:RadScriptManager ID="RadScriptManager1" runat="server">
</telerik:RadScriptManager>
<uc:RejectedComment id="RejectionComment1" runat="server" />
</form>

我添加了我的代码,用于ascx文件中的更新,前端的javascript

<script language ="javascript" type ="text/javascript" >   
    //<![CDATA[
    function GetRadWindow() {
        var oWindow = null;
        if (window.radWindow) oWindow = window.radWindow; //Will work in Moz in all cases, including clasic dialog
        else if (window.frameElement.radWindow) oWindow = window.frameElement.radWindow; //IE (and Moz as well)

        return oWindow;
    }

    function CancelEdit() {
        GetRadWindow().close();
    }

    //]]>
</script>  

最后但并非最不重要的是在按钮点击事件成功更新后关闭窗口;

Page.ClientScript.RegisterStartupScript(Page.GetType(), "", "CancelEdit();", true);

我希望其他人觉得这很有用。我花了几个小时去找Telerik网站找到这件作品。