【问题标题】:how to Save PrintDocument .PrinterSettings in a file so that user have not to select printer settings everytime?如何将 PrintDocument .PrinterSettings 保存在文件中,以便用户不必每次都选择打印机设置?
【发布时间】:2015-10-17 18:48:11
【问题描述】:

我正在使用打印预览打印文档,每次用户单击打印数据时,都会提示询问打印机设置的对话框,这当然不好。因此,为了删除该打印对话框,我需要将打印对话框设置存储在硬盘上的某个位置。

代码

        PrintDocument pd = new PrintDocument();
        pd.PrintPage += new PrintPageEventHandler(PrintPage);
        PrintDialog pdi = new PrintDialog();
        pdi.Document = pd;
        if (pdi.ShowDialog() == DialogResult.OK)
        {
            doc.PrinterSettings = pdi.PrinterSettings;
            pd.Print();
        }
        else
        {
            MessageBox.Show("Print Cancelled");
        }

问题

如何以某种格式存储打印对话框设置并将其检索并存储在对象中?

P.S: 下次重启应用时需要保存设置。

【问题讨论】:

  • 想到的第一个选项是为每个单独的值使用应用程序设置。

标签: c# winforms


【解决方案1】:

在项目的设置文件中创建一个设置键并为其选择System.drawing.Printing.PrinterSettings 类型并将其命名为例如PrinterSettins。然后你可以将你的打印机设置保存在这个属性中,或者简单地从这个属性中读取。

您还可以为PrinterSettings 的各个属性创建一些设置键,例如PrinterName 保存它们。

保存:

if(printDialog1.ShowDialog()==DialogResult.OK)
{
   Properties.Settings.Default.PrinterSettings = printDialog1.PrinterSettings;
   //Properties.Settings.PrinterName = printDialog1.PrinterSettings.PrinterName;
   Properties.Settings.Default.Save();
}

阅读:

printDocument1.PrinterSettings = Properties.Settings.Default.PrinterSettings;
//printDocument1.PrinterSettings.PrinterName = Properties.Settings.Default.PrinterName;

注意:

编辑

由于PrinterSettings类是可序列化的,另一种解决方案是将其转换为base64字符串并保存在字符串中并从字符串中恢复。因此,您可以创建一个字符串设置键PrinterSettings 并将PrinterSettings 保存在其中或从中恢复:

保存:

Properties.Settings.Default.PrinterSettings=SettingToString( printDialog1.PrinterSettings);
Properties.Settings.Default.Save();

阅读:

printDocument1.PrinterSettings = SettingFromString(Properties.Settings.Default.PrinterSettings);

辅助方法:

private string SettingToString(PrinterSettings settings)
{
    if (settings == null)
        return null;

    var bf = new BinaryFormatter();
    using (var ms = new MemoryStream())
    {
        bf.Serialize(ms, settings);
        return Convert.ToBase64String(ms.ToArray());
    }
}

private PrinterSettings SettingFromString(string base64)
{
    try
    {
        BinaryFormatter bf = new BinaryFormatter();
        using (var ms = new MemoryStream(Convert.FromBase64String(base64)))
        {
            return (PrinterSettings)bf.Deserialize(ms);
        }
    }
    catch (Exception)
    {
        return new PrinterSettings();
    }
}

【讨论】:

  • 下次重启应用时还能用吗?
  • 是的,设置基础架构就是为这种情况设计的。
  • 如何创建设置键?
  • 如果您愿意,还可以使用设置来保存 PrinterSettings 的各个属性。
  • 这太好了!!忘记添加重要字段的错误 XML 序列化程序!
猜你喜欢
  • 2014-03-31
  • 1970-01-01
  • 2012-07-14
  • 2017-02-03
  • 2017-11-26
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
相关资源
最近更新 更多