XAF點滴:很具體很用實用---處理三個小問題

来源:http://www.cnblogs.com/foreachlife/archive/2016/10/21/5984160.html
-Advertisement-
Play Games

以下內容全部為web版本的老模板風格下完成。 一、在編輯狀態的詳細視圖下列印報表。 有些時候,需要在編輯狀態下直接列印報表內容,官方預設是不允許這樣做的。用Reflector查看源碼,可以看到: 在這個方法中禁止了顯示按鈕的邏輯。 ShowInReportActionEnableModeDefaul ...


以下內容全部為web版本的老模板風格下完成。

一、在編輯狀態的詳細視圖下列印報表。

有些時候,需要在編輯狀態下直接列印報表內容,官方預設是不允許這樣做的。用Reflector查看源碼,可以看到:

Declaring Type: DevExpress.ExpressApp.ReportsV2.PrintSelectionBaseController 
Assembly: DevExpress.ExpressApp.ReportsV2.v16.1, Version=16.1.5.0
protected virtual void UpdateActionState()
{
    if (base.View != null)
    {
        this.ShowInReportAction.Enabled["DisableActionWhenThereAreChanges"] = true;
        if (this.ShowInReportActionEnableMode == ActionEnabledMode.ModifiedChanged)
        {
            this.ShowInReportAction.Enabled["DisableActionWhenThereAreChanges"] = !base.View.ObjectSpace.IsModified;
        }
        else if ((this.ShowInReportActionEnableMode == ActionEnabledMode.ViewMode) && (base.View is DetailView))
        {
            this.ShowInReportAction.Enabled["DisableActionWhenThereAreChanges"] = ((DetailView) base.View).ViewEditMode == ViewEditMode.View;
        }
    }
}

在這個方法中禁止了顯示按鈕的邏輯。

ShowInReportActionEnableMode 是在構造函數中做了初始化,如下:
public PrintSelectionBaseController()
{
    base.TypeOfView = typeof(ObjectView);
    this.showInReportAction = new SingleChoiceAction(this, "ShowInReportV2", PredefinedCategory.Reports);
    this.showInReportAction.Caption = "Show in Report";
    this.showInReportAction.ToolTip = "Show selected records in a report";
    this.showInReportAction.Execute += new SingleChoiceActionExecuteEventHandler(this.showInReportAction_Execute);
    this.showInReportAction.ItemType = SingleChoiceActionItemType.ItemIsOperation;
    this.showInReportAction.SelectionDependencyType = SelectionDependencyType.RequireMultipleObjects;
    this.showInReportAction.ImageName = "Action_Report_Object_Inplace_Preview";
    this.ShowInReportActionEnableMode = ShowInReportActionEnableModeDefault;  //<<<<---------------看這裡
}
 
 
ShowInReportActionEnableModeDefault 是一個靜態變數。

public static ActionEnabledMode ShowInReportActionEnableModeDefault;

也就是說,可以全局設定行為。 再來詳細的看一下如何顯示的邏輯:

protected virtual void UpdateActionState()
{
    if (base.View != null)
    {
        this.ShowInReportAction.Enabled["DisableActionWhenThereAreChanges"] = true; //預設可以用,但這個名稱取的和值是不是很難理解?
        if (this.ShowInReportActionEnableMode == ActionEnabledMode.ModifiedChanged) //標註1
        {
            this.ShowInReportAction.Enabled["DisableActionWhenThereAreChanges"] = !base.View.ObjectSpace.IsModified;
        }
        else if ((this.ShowInReportActionEnableMode == ActionEnabledMode.ViewMode) && (base.View is DetailView)) //這個模式下,只有當前詳細視圖是查看時才能用。
        {
            this.ShowInReportAction.Enabled["DisableActionWhenThereAreChanges"] = ((DetailView) base.View).ViewEditMode == ViewEditMode.View;
        }
    }
}

 

標註1:如果 模式設置為ModifiedChanged則, 有編輯的對象,就不可以用這個按鈕。看到這裡你一定認為,官方不是支持了編輯狀態的列印報表了嗎?然而,這個ObjectSpace.IsModified的值在沒,有編輯時也經常會變為true,即使是剛剛按過保存按鈕。
我認為用這個值做判斷很難控制,不如直接改掉吧。
多說一句,官方的考慮是正確的,如:你剛剛修改了內容,沒按保存去列印單據,那麼結果可能資料庫里的內容和列印的結果是不一致的。
所以我們進行一下改造。


    public class PrintReportController : PrintSelectionBaseController
    {
        protected override void UpdateActionState()
        {
            if (View is DetailView)
            {
                //詳細視圖下,都是可用的
            }
            else
            {
                base.UpdateActionState(); //如果不是detailview時,還按原來的邏輯走
            }

        }

        protected override void ShowInReport(SingleChoiceActionExecuteEventArgs e, string reportContainerHandle)
        {
            var dv = View as DetailView;
            if (dv != null && dv.ViewEditMode == DevExpress.ExpressApp.Editors.ViewEditMode.Edit)
            {
                this.ObjectSpace.CommitChanges();
            }//執行按鈕前,先保存一下數據
            base.ShowInReport(e, reportContainerHandle);
        }
    }

就是這麼簡單。

二、讓查看狀態的視圖支持“返回”到上一個視圖的功能。

這個相當簡單,當做初學者的學習示例吧,但用戶還是很需要這個功能的。

    public partial class CloseDetailViewController : ViewController<DetailView>
    {
        public CloseDetailViewController()
        {
            InitializeComponent();
            this.CloseViewModeDetail.Execute += CloseViewModeDetail_Execute;
            // Target required Views (via the TargetXXX properties) and create their Actions.
        }

        private void CloseViewModeDetail_Execute(object sender, SimpleActionExecuteEventArgs e)
        {
            this.View.Close();
        }

        protected override void OnActivated()
        {
            base.OnActivated();
            this.CloseViewModeDetail.Active["InViewMode"] = View.ViewEditMode == ViewEditMode.View; //這個按鈕只有在查看狀態中顯示
            // Perform various tasks depending on the target View.
        }
        protected override void OnViewControlsCreated()
        {
            base.OnViewControlsCreated();
            // Access and customize the target View control.
        }
        protected override void OnDeactivated()
        {
            // Unsubscribe from previously subscribed events and release other references and resources.
            base.OnDeactivated();
        }
    }
//按鈕是這樣設置的:
this.CloseViewModeDetail.Caption = "返回"; this.CloseViewModeDetail.Category = "Export"; this.CloseViewModeDetail.Id = "CloseViewModeDetail";

三、在編輯狀態的主表點擊明細表時直接轉到編輯狀態

這個功能也很實用,因為點擊編輯按鈕有點累,按鈕圖標太小,如果點擊任意行位置,彈出的是查看狀態的記錄內容。所以現在改變為,如果是編輯狀態的主表,彈出的也是編輯狀態的界面。

 public partial class DetailItemViewController : ViewController<DetailView>
    {
        public DetailItemViewController()
        {
            InitializeComponent();
        }
        protected override void OnActivated()
        {
            base.OnActivated();
            var os = this.ObjectSpace as XPNestedObjectSpace; //如果有上級詳細視圖並且是在編輯狀態的視圖,那把本級別的編輯視圖也設置成編輯狀態。
            if (os!=null)
            {
                var dv = os.ParentObjectSpace.Owner as DetailView;
                if (dv!=null)
                {
                    this.View.ViewEditMode = dv.ViewEditMode;
                }
            }
            // Perform various tasks depending on the target View.
        }
        protected override void OnViewControlsCreated()
        {
            base.OnViewControlsCreated();
            // Access and customize the target View control.
        }
        protected override void OnDeactivated()
        {
            // Unsubscribe from previously subscribed events and release other references and resources.
            base.OnDeactivated();
        }
    }

現在XAF中支持的列表自由編輯還有有很多不支持的功能,這樣折中處理一下也不錯。

 

 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 老規矩,先簡單介紹下MQTT: MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通訊協議,有可能成為物聯網的重要組成部分。該協議支持所有平臺,幾乎可以把所有聯網物品和外部連接起來,被用來當做感測器和致動器(比如通過Twitte ...
  • 在項目中,有時候一些信息不便完全顯示,只需要顯示部分信息。現在提供一些隱藏敏感信息的操作方法,主要為對信息的截取操作: 1.指定左右字元數量,中間的*的個數和實際長度有關: 2.指定左右字元數量,中間的*的個數固定: 3.“*”數量一定,設置為4個,按信息總長度的比例來取,預設左右各取1/3: 4. ...
  • 一、前言 前不久因公司產品需要完成了線上升級功能,因為編程技術不精,不敢冒然採用Socket方法實現線上升級,所以使用比較方便穩妥的WCF方式 如果考慮併發能力的話還是Socket>WCF>Remoting,所以如果你是Socket專家的話這篇你就不用看了。 二、流程 本篇主要講述一個完整的升級思路 ...
  • 在.NET項目中,我們較多的使用到加密這個操作。因為在現代的項目中,對信息安全的要求越來越高,那麼多信息的加密就變得至關重要。現在提供幾種常用的加密/解密演算法。 1.用於文本和Base64編碼文本的互相轉換 和 Byte[]和Base64編碼文本的互相轉換: (1).將普通文本轉換成Base64編碼 ...
  • 上一章筆者對於WinForm開發過程用到的幾個知識點做了講解。筆者們可以以此為開端進行學習。而本章我們來講一個跟ORM思想有關的知識點。在講之前讓我們想一下關於JAVA的hibernate知識點。hibernate也是ORM框架。記得hibernate裡面有一個叫HQL。先不管HQL的好與壞。主要是 ...
  • 一、目標樣式 我們要實現上圖中的效果,需要如下的操作: 1.從工具欄上的”Smobiler Components”拖動一個Button控制項到窗體界面上 2.修改Button按鈕的屬性 a.Size屬性 設置控制項的寬度和高度,見下圖; b.BarcodeScanned事件代碼 3.Smobiler窗體 ...
  • 說到參數獲取,大家肯定會說,能玩出什麼花來呢! 今天我們就來說說,關於Request[“參數名”],你天天和他打交道的主! Long ago,一經理跟我說,今天你來開發一個註冊的頁面吧,註冊的實體類,都已經有啦!如下: 好啦,你可以開發了! 按照策劃稿,頁面樣式,腳本,都已經寫好了,接下來,需要提交 ...
  • 因為ComboxItem是Object對象,而控制項自身沒有Value屬性.所以,需要自定義一個類,用其對象來存儲Text,Value. public class ComboxItem { private string text; private string values; public strin ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...