Combobox отображает ValueMember вместо DisplayMember - PullRequest
0 голосов
/ 27 июня 2018

У меня есть простой класс User, как показано ниже:

public class User
    {
        public int UserId { get; set; }
        public string Name { get; set; }
        public string Surname { get; set; }
        public string FullName
        {
            get
            {
                return Name + " " + Surname;
            }
        }
    }

Тогда у меня есть форма frmProcess, которая отображает список пользователей в выпадающем списке, как показано ниже. Проблема в том, что если я установил DisplayMember в FullName, то отображается столбец UserId. Что странно, что если я установлю DisplayMember на Фамилия, то отображается Фамилия. Что я делаю не так?

public partial class frmProcess : Form
    {
        List<User> Users;

        private async void frmProcess_Load(object sender, EventArgs e)
        {
            Users = new List<User>();

            User A = new User { UserId = 1, Name = "Michael", Surname = "Smith" };
            User B = new User { UserId = 2, Name = "John", Surname = "Johnson" };

            Users.Add(A);
            Users.Add(B);

            cmbStartedBy.DataSource = Users;
            cmbStartedBy.DisplayMember = "FullName";
            cmbStartedBy.ValueMember = "UserId";
        }
    }

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Хорошо, нашли ошибку. Когда я публиковал свой вопрос, я упростил свой класс и удалил, среди прочего, аннотации данных. Удивительно, но это заставило код работать правильно. Как оказалось, проблема была вызвана тем, что свойство FullName было помечено как [Browsable (false)]. Я пометил его как неразборчивый, чтобы это свойство не отображалось в DataGridViews, и не осознавал, что это также влияет на комбинированные списки.

public class User
    {
        [DisplayName("ID")]
        public int UserID { get; set; }
        [DisplayName("Imie")]
        [Required(AllowEmptyStrings = false, ErrorMessage = "Pole imie nie może być puste!")]
        public string Name { get; set; }
        [DisplayName("Nazwisko")]
        [Required(AllowEmptyStrings = false, ErrorMessage = "Pole nazwisko nie może być puste!")]
        public string Surname { get; set; }
        [Browsable(false)]// <-- this was causing the issue
        public string FullName
        {
            get
            {
                return Name + " " + Surname;
            }
        }
    }
0 голосов
/ 27 июня 2018

Я запустил ваш точный код в приложении winforms в VS2013 и получил это:

РЕДАКТИРОВАТЬ: Единственная разница заключается в асинхронности при загрузке формы.

enter image description here

Весь код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

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

        List<User> Users;

        private void Form1_Load(object sender, EventArgs e)
        {
            Users = new List<User>();

            User A = new User { UserId = 1, Name = "Michael", Surname = "Smith" };
            User B = new User { UserId = 2, Name = "John", Surname = "Johnson" };

            Users.Add(A);
            Users.Add(B);

            comboBox1.DataSource = Users;
            comboBox1.DisplayMember = "FullName";
            comboBox1.ValueMember = "UserId";
        }
    }

    public class User
    {
        public int UserId { get; set; }
        public string Name { get; set; }
        public string Surname { get; set; }
        public string FullName
        {
            get
            {
                return Name + " " + Surname;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...