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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...