【问题标题】:Launching a Edit Form from a GridButtonColumn从 GridButtonColumn 启动编辑表单
【发布时间】:2011-11-01 21:00:40
【问题描述】:

我有一个类,它定义了一个层次化的 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);
}

【问题讨论】:

    标签: c# asp.net ajax telerik radgrid


    【解决方案1】:

    看起来你只需要改用OnClientClick,并返回确认对话框的值。

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

    RadAjax 在确认对话框时有点怪癖,因此您可能需要改用它:

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

    【讨论】:

    • 嘿詹姆斯,谢谢我的那部分工作正常,只是现在要求他们在拒绝项目时添加评论。所以我正在重新发明。我能够让它与 JavaScript 和 aspx 表单一起使用,但我想结合内置功能来加载用户控件,就像使用自定义编辑表单一样。
    【解决方案2】:

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

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

    我从上面修改了这部分:

        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);
        }
    

    我将这个添加到带有数据网格的页面中:

    <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 网站上逐个找到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多