Настроить или отключить проверку на DevExpress LookupEdit? - PullRequest
0 голосов
/ 23 октября 2019

У меня есть LookupEdit в приложении WinForms;EditValue привязано к модели, где свойство имеет значение int? и помечено атрибутом Required. Основная проблема, с которой я столкнулся, заключается в том, что элемент управления DX обнаруживает атрибут, что было бы хорошо, но затем предотвращает потерю фокуса элемента управления, пока значение не будет выбрано из списка. Вы даже не можете закрыть приложение, как только показывает поставщик ошибок.

Если вы запустите приложение и попробуете щелкнуть текстовое поле, LookupEdit проверит и предотвратит выход фокуса из элемента управления. В идеале я бы хотел просто изменить фокус и показать поставщика ошибок. Как я могу 1) настроить LookupEdit так, чтобы он терял фокус, даже если элемент управления недействителен, а также настроить, где отображается значок ошибки, или 2) сказать DX игнорировать аннотации данных? Наш код формы включит / отключит кнопку сохранения, если модель недействительна, мне не нужен DX, чтобы заставить пользователя оставаться в элементе управления до тех пор, пока он не станет действительным.

Создание проекта Windows Forms с именем DxDataAnnotations с .Net 4.7.2 и добавьте пакет devexpress.win NuGet, используя версию 19.1.6. Вот код формы (с включенными моделями):

Form1.cs

using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Windows.Forms;

namespace DxDataAnnotations {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        protected override void OnShown(EventArgs e) {
            base.OnShown(e);

            managersBindingSource.DataSource = new BindingList<Manager>(new[] { 
                new Manager(1, "Manager 1"),
                new Manager(2, "Manager 2"),
                new Manager(3, "Manager 3"),
                new Manager(4, "Manager 4"),
                new Manager(5, "Manager 5"),
                new Manager(6, "Manager 6")
            });

            employeeBindingSource.DataSource = new Employee();
        }
    }

    public sealed class Employee {
        [Required]
        public int? ManagerId { get; set; }
    }

    public sealed class Manager {
        public Manager(int id, string name) {
            ManagerId = id;
            ManagerName = name;
        }

        public int ManagerId { get; }
        public string ManagerName { get; }
    }
}

Form1.Designer.cs

namespace DxDataAnnotations {
    partial class Form1 {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing) {
            if (disposing && (components != null)) {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent() {
            this.components = new System.ComponentModel.Container();
            this.lookUpEdit1 = new DevExpress.XtraEditors.LookUpEdit();
            this.employeeBindingSource = new System.Windows.Forms.BindingSource(this.components);
            this.managersBindingSource = new System.Windows.Forms.BindingSource(this.components);
            this.textBox1 = new System.Windows.Forms.TextBox();
            ((System.ComponentModel.ISupportInitialize)(this.lookUpEdit1.Properties)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.employeeBindingSource)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.managersBindingSource)).BeginInit();
            this.SuspendLayout();
            // 
            // lookUpEdit1
            // 
            this.lookUpEdit1.DataBindings.Add(new System.Windows.Forms.Binding("EditValue", this.employeeBindingSource, "ManagerId", true));
            this.lookUpEdit1.Location = new System.Drawing.Point(207, 93);
            this.lookUpEdit1.Name = "lookUpEdit1";
            this.lookUpEdit1.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
            new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)});
            this.lookUpEdit1.Properties.Columns.AddRange(new DevExpress.XtraEditors.Controls.LookUpColumnInfo[] {
            new DevExpress.XtraEditors.Controls.LookUpColumnInfo("ManagerId", "Manager Id", 78, DevExpress.Utils.FormatType.Numeric, "", false, DevExpress.Utils.HorzAlignment.Far, DevExpress.Data.ColumnSortOrder.None, DevExpress.Utils.DefaultBoolean.Default),
            new DevExpress.XtraEditors.Controls.LookUpColumnInfo("ManagerName", "Manager Name", 82, DevExpress.Utils.FormatType.None, "", true, DevExpress.Utils.HorzAlignment.Near, DevExpress.Data.ColumnSortOrder.None, DevExpress.Utils.DefaultBoolean.Default)});
            this.lookUpEdit1.Properties.DataSource = this.managersBindingSource;
            this.lookUpEdit1.Properties.DisplayMember = "ManagerName";
            this.lookUpEdit1.Properties.ValueMember = "ManagerId";
            this.lookUpEdit1.Size = new System.Drawing.Size(398, 20);
            this.lookUpEdit1.TabIndex = 0;
            // 
            // employeeBindingSource
            // 
            this.employeeBindingSource.AllowNew = false;
            this.employeeBindingSource.DataSource = typeof(DxDataAnnotations.Employee);
            // 
            // managersBindingSource
            // 
            this.managersBindingSource.DataSource = typeof(DxDataAnnotations.Manager);
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(222, 135);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(100, 20);
            this.textBox1.TabIndex = 1;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(800, 450);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.lookUpEdit1);
            this.Name = "Form1";
            this.Text = "Form1";
            ((System.ComponentModel.ISupportInitialize)(this.lookUpEdit1.Properties)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.employeeBindingSource)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.managersBindingSource)).EndInit();
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private DevExpress.XtraEditors.LookUpEdit lookUpEdit1;
        private System.Windows.Forms.BindingSource employeeBindingSource;
        private System.Windows.Forms.BindingSource managersBindingSource;
        private System.Windows.Forms.TextBox textBox1;
    }
}

1 Ответ

1 голос
/ 23 октября 2019

А как насчет удаления атрибута валидации из модели (напрямую или через упаковку экземпляров модели в конкретный DTO)?
В любом случае, вот несколько ответов:

В идеале я бы хотелчтобы просто изменить фокус и показать поставщика ошибок.

Взгляните на свойство Form.AutoValidate , которое управляет тем, как элемент управления проверяет свои данные, когда теряет фокус ввода пользователя. ,Значение AutoValidate.EnableAllowFocusChange позволяет пользователю перемещать фокус между редакторами независимо от результата проверки.

... предписывать DX игнорировать аннотации данных?

Вы можете избежать проверкииспользуя статическую опцию DevExpress.Data.Utils.AnnotationAttributes.AllowValidation:

DevExpress.Data.Utils.AnnotationAttributes.AllowValidation = DevExpress.Utils.DefaultBoolean.False;
...