在PropertyGridView(WinForms)中选择PaperSize

时间:2019-04-15 16:38:06

标签: c# propertygrid

我是C#的新手,我正在开发POS软件桌面应用程序(WinForms),并且我想使用PropertyGridView来让用户选择打印机和“ PaperSize”,然后保存这些用户首选项(可能是序列化偏好类别)。

我在一个窗口中有属性网格,在一个类中有所有首选项。现在,我可以选择打印机并提供纸张尺寸列表。

当我单击打印机时,会得到纸张尺寸并将它们放在列表中。

我的问题是:

  1. 我不知道如何仅显示PapeSize的名称。
  2. 选择PaperSize后,出现错误消息(“属性值无效”),我不知道如何存储/保存选择。

Screen shot of my property grid selecting the paper size

这是首选项类定义和相关方法。

        [Browsable(false)]
        public static List<string> lstImpresoras;

        [Browsable(false)]
        public static List<PaperSize> lstPapel = new List<PaperSize>();


// -- other properties here...

        [ReadOnly(false)]
        [Category("Impresoras")]
        [DisplayName("Impresora de Tickets")]
        [Description("Nombre de la impresora que se usará en esta terminal para imprimir los tickets de venta")]
        [TypeConverter(typeof(MiConvertidorDeImpresoras))]
        public string printerTicketsName { get; set; }

// -- more properties here...

        public class MiConvertidorDeImpresoras : TypeConverter
        {
            public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
            {
                return true;
            }

            public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
            {
                //string[] nations = { "Impresora 1", "Impresora 2", "Impresora 3" };
                //return new StandardValuesCollection(nations);
                return new StandardValuesCollection(lstImpresoras);
            }
        }

        public class MiConvertidorDePapel : TypeConverter
        {
            public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
            {
                return true;
            }

            public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
            {
                return new StandardValuesCollection(lstPapel);
            }
        }

        private void getPrinters()
        {
            lstImpresoras = new List<string>();

            foreach (string impresora in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
            {
                lstImpresoras.Add(impresora);
            }
        }


        public void getPaperSizes()
        {
            PrintDocument pd = new PrintDocument();
            pd.PrinterSettings.PrinterName = printerTicketsName;
            lstPapel.Clear();
            PaperSize pkSize;
            for (int i = 0; i < pd.PrinterSettings.PaperSizes.Count; i++)
            {
                pkSize = pd.PrinterSettings.PaperSizes[i];
                lstPapel.Add(pkSize);
            }
        }

在托管属性网格的窗口中……

        public WPreferencias()
        {
            InitializeComponent();
            propertyGrid1.SelectedObject = preferencias;
            propertyGrid1.PropertyValueChanged += PropertyGrid1_PropertyValueChanged;
        }

        private void PropertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
        {
            if (e.ChangedItem.Label == "Impresora de Tickets")
            {
                preferencias.getPaperSizes();
                propertyGrid1.Refresh();
            }
        }

任何建议将不胜感激。 谢谢你。

0 个答案:

没有答案