none
關於 PrintDialog 所選定的印表機的預設紙張格式? RRS feed

  • 問題

  • 不知各位先進是否有注意到一個狀況

    PrintDialog 會將所有的印表機的列印喜好設定的 Page,設成 預設印表機的列印喜好設定中的 Page 設定。

    ( 並不是真的變更原始設定,而是經由列印對話視窗開啟的列印喜好設定 )

    舉例: A印表機為預設印表機,紙張設定為 A4,

    B印表機紙張設定為 Letter,

    C印表機紙張設定為A3,

    開啟 PrintDialog, 並選取 B印表機, 讀取 PrintDialog.PrintSettings.DefaultSetting.PageSize, 會讀到 A4, 而不是 Letter。

    雖然有其他辦法可以抓到 B印表機的紙張設定,可是卻會喪失,挑選其他種類紙張的靈活度。

    各位先進,有辦法解決這類的問題嗎?

    PS. 在 Word 開啟的 列印對話視窗,並沒有這個問題。( 我的 Word 版本是 2003 的,其他本版,我不確定 )

     

    2007年2月9日 上午 07:00

所有回覆

  • 是的我也遇到同樣的問題.. 系統的紙張都會帶入預設印表機的紙張..而不是新選印表機的紙張..

    會造成列印錯誤...

    目前只有部份印表機的驅動有解決此問題.. 其他舊型的印表機驅動都會帶錯紙... 不知有沒有什麼解法??

    2017年6月22日 上午 03:26
  • 所以你是打算人工用程式設定預設值還是怎樣?

    我是知道對話盒開起來的預設值可以設定,表示你預設選了哪台印表機跟紙張。

    但是切換各台印表機的預設值就不知道,可能要查回呼函數那塊,看切換印表機時,是不是會觸發。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年6月22日 下午 05:13
  • 林小庫

    按照你的想法,你是想一次性地記住上一次他人使用過的印表機的紙張設定(比如說默認的確A4,但是我手動改成Letter,下次應該打開應該是Letter而不能是A4)?


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report



    2017年7月17日 上午 05:32
  • 這似乎是微軟印表機系統的一個 BUG

    舉例如下:

    甲 雷射印表機 預設紙張為 A4 , 乙 點陣印表機 預設紙張為 Later

    A User 經常使用 甲 雷射印表機 列印 A4 紙張 所以 預設為 甲印表機

    B User 經常使用 乙 點陣印表機 列印 Later 出貨單 所以 預設為 乙印表機

    當 B User 突然想印 A4報表 而在列印時 改選 甲印表機 會發現沒有印出來.. 仔細查看..會發現 系統紙張並沒有依新選的印表機改為A4.

    或是 A User 突然想印 Later 時 改選 乙印表機 也會發現沒有印出來.. 仔細查看..會發現 系統紙張並沒有依新選的印表機自動改為Later.

    我們在設計報表時通常不會指定印表機, 以利依使用者彈性選定他想輸出的印表機...
    當使用者選到不同預設紙張的印表機時..問題就發生了.. 且報表已設定紙張SIZE也沒有用...系統仍是帶到上個錯誤的預設紙張..

    2017年7月17日 上午 07:14
  • 其實我們可以用一些方法繞開這些Bug:

    預先準備工作:

    拖拽一個PrintDialog+PrintDocument。把PrintDialog的Document設置為PrintDocument。

    1)準備一個App.config文件,其中加上appSettings,使用ConfigurationManager進行全局保存,文件如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      
      <appSettings>
        <!--紙張大小-->
        <add key="PaperSize" value="A4"/>
        <!--打印機名稱-->
        <add key="PrintName" value="Fax"/>
      </appSettings>
      
        <startup
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
        </startup>
       
    </configuration>

    2)每次窗體加載前應該讀取打印機的名稱和紙張大小(我這裡是實驗而已):

    namespace WinFormThread
    {
        using System.Configuration;
        using System.Linq;
        using System;
        using System.Drawing.Printing;
        using System.Windows.Forms;
     
        public partial class frm : Form
        {
            private Configuration _cm = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
     
            public frm()
            {
                InitializeComponent();
     
                _prnDlg.Document.DefaultPageSettings.PaperSize = GetSpecificPaperSize(_cm.AppSettings.Settings["PaperSize"].Value);
     
                _prnDlg.PrinterSettings.PrinterName = _cm.AppSettings.Settings["PrintName"].Value;
              
            }
     
            //根據保存的紙張名稱獲取PaperSize
            private PaperSize GetSpecificPaperSize(string storedName)
            {
                return _prnDlg.PrinterSettings.PaperSizes.Cast<PaperSize>().FirstOrDefault(p => p.PaperName.Equals(storedName));
            }
            //當按下打印按鈕,自動保存新的設置
            private void button1_Click(object sender, EventArgs e)
            {
     
                if (_prnDlg.ShowDialog() == DialogResult.OK)
                {
                    var choosenPaperSize = _prnDlg.Document.DefaultPageSettings.PaperSize.PaperName;
     
                    var choosenPrinterName = _prnDlg.PrinterSettings.PrinterName;
     
                    _cm.AppSettings.Settings["PrintName"].Value = choosenPrinterName;
                        _cm.AppSettings.Settings["PaperSize"].Value = choosenPaperSize;
                        _cm.Save();
     
                }
            }
        }
    }

    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report

    2017年7月17日 上午 08:04