Member 11403304 Ответов: 1

Как получить значение электронной почты из объекта в списке?


У меня есть список, в котором отображаются имя и фамилия. Каждый элемент в списке является объектом. Это означает, что даже если я показываю имена (потому что пользователю легче смотреть на список имен, а не на электронные письма), можно получить электронную почту от каждого выбранного имени (объекта). Я не знаю, как это сделать.
Мой вопрос заключается в том, как я могу получить электронное письмо, связанное с выбранным именем (элемент в списке)?

Что я уже пробовал:

Проблема с моим кодом заключается в том, что ListItem.ToString()) содержит отображаемое имя, а не адрес электронной почты. Я хочу получить электронное письмо внутри объекта.
Например, Джо Доу-это выбранное имя (ListItem) в списке. Электронная почта Джо Доу находится внутри объекта. Когда я навожу курсор на staffEmails, который имеет 16 объектов, я нахожу электронную почту Джо Доу, копируя выражение. Вот выражение для электронной почты Джо Доу
(new System.Collections.Generic.Mscorlib_CollectionDebugView<FTACaseReset.Models.GetRequestorInfoModel>(staffEmails).Items[1]).Email


mailMessage.To.Add(to);
List<GetRequestorInfoModel> staffEmails = new List<GetRequestorInfoModel>();
staffEmails = await FTACaseReset.Controllers.RequestorInfoController.GetAllRequestorInfoes();
ListBoxItem staffEmail = new ListBoxItem();
staffEmail.Text = staffEmails[0].Email;
foreach (var ListItem in MyListBox.SelectedItems)
{
MailAddress to = new MailAddress(ListItem.ToString());
}


Вот как я заполняю список

public async void PopulateAdditionalStaffEmailListBox()
    {
        List<getrequestorinfomodel> staffEmails = new List<getrequestorinfomodel>();
        try
        {
            staffEmails = await FTACaseReset.Controllers.RequestorInfoController.GetAllRequestorInfoes();
            staffEmails = staffEmails.OrderBy(x => x.DisplayName).ToList();
            for (int i = 0; i < staffEmails.Count; i++)
            {
                ListBoxItem staffEmail = new ListBoxItem();
                staffEmail.Text = staffEmails[i].DisplayName;
                //staffEmail.Text = staffEmails[i].Email;
                staffEmail.Value = staffEmails[i].Email 
                AdditionalStaffEmailListBox.Items.Add(staffEmail.Text).ToString();
            }
        }
    }

Richard MacCutchan

Просто получите объект и извлеките свойство электронной почты. Или переработайте объект так, чтобы он отображал электронную почту из своего ToString метод. А почему звонят ToString на Text поля

Member 11403304

Привет, Ричард. Я не знаю, как получить объект и извлечь свойство электронной почты. Вот где я застрял. У меня уже есть код, который отправляет электронные письма, когда я заполняю свой список электронной почтой. Однако владелец проекта сказал мне, чтобы я отображал имена, а не электронные письма в списке для выбора пользователем. Каждый элемент в списке-это объект, который также содержит электронную почту. Но я не знаю, как извлечь электронную почту из объекта. Вот почему я включил в свой вопрос много деталей.

Maciej Los

Нет. ListBoxItem не содержит объекта электронной почты, потому что вы не установили его в своем коде.
Кстати: используйте виджет "ответить", если вы хотите, чтобы система информировала пользователей о ваших ответах.

Member 11403304

Я забыл обновить код здесь. Я действительно внес изменения в свой код и установил такие электронные письма, как staffEmail.Value = staffEmails[i].Email. Однако я-почтовый адрес(ListItem.Ценность.Метод toString()) Я получаю o'Object не содержит определения для "Value", и никакой доступный метод расширения "Value", принимающий первый аргумент типа "object", не может быть найден (вы пропускаете директиву using или ссылку на сборку?) когда я использую значение в MailAddress

Richard MacCutchan

Я предлагаю Вам почитать о классах и там членских аксессорах. Вы не можете писать код, подобный приведенному выше, если не понимаете основ ООП.

Maciej Los

Это проект WPF?

j snooze

Мне кажется, что лучше всего будет, если вы свяжете свой объект списка со списком с помощью привязки данных, а затем установите свойства отображения и значения на то, что вы хотите показать. Затем, когда вы получаете SelectedItem(ы) списка, вы можете получить объект getrequestorinfomodel обратно для каждого элемента, так что весь объект привязан к каждому объекту элемента списка.

обычно это что-то вроде
список.Источник данных = staffemails
списка.Displaymember = "Отображаемое Имя"
listbox.ValueMember = "какой-то идентификатор здесь? или по электронной почте, если вы предпочитаете"

но тогда вы можете получить
var selecteditem = (getrequestorinfomodel)lisbox.Элемент
и тогда вы можете получить адрес электронной почты
элемент.Электронной почты

Member 11403304

Должен ли я добавить код к коду, который заполняет список?

j snooze

привязка данных к списку заменит цикл "for", который у вас есть. Вы можете просто прокомментировать это, если хотите сохранить его в случае, если это не сработает для вас. хотя так и должно быть.

Member 11403304

Когда я набираю ListBox. источник данных недоступен среди того, что я могу выбрать.

j snooze

Попробуй все-таки положить его туда. Я действительно считаю его действительным, intellisense, возможно, не отображает его должным образом.

Смотрите эту ссылку для примера, где они используют его в списке

https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listcontrol.datasource?view=netframework-4.8

Member 11403304

Вы были правы, источник данных доступен. Вы сказали заменить петлю "для". У меня их 2 штуки. Один-при добавлении элементов в PopulateAdditionalStaffEmailListbox, а другой-при отправке электронной почты. Какой из них я должен заменить? Я попробовал добавить элементы в список и обнаружил, что список не заполнен. По крайней мере, я не вижу никаких добавленных предметов.

j snooze

Тот, где вы заполняете поле списка.
Итак, staffEmails-это ваш объект списка. это должно быть вашим источником данных
Теперь (если я правильно прочитал ваш код)
AdditionalStaffEmailListBox.Источник данных = staffEmails;
AdditionalStaffEmailListBox.DisplayMember = ????; //имя свойства объекта, которое вы хотите отобразить
AdditionalStaffEmailListBox.ValueMember = ????;


это может заменить весь цикл for, который заполняет ваш список. Установка источника данных в коллекцию List<> должна заполнить поле listbox для вас.

Member 11403304

Теперь я застрял на том, как отправлять электронные письма выбранным именам в списке. Я не знаю, как добавить код, который вы предложили, в мой "foreach". У меня есть следующий var selectedItem = (GetRequestorInfoModel)AdditionalStaffEmailListBox.SelectedItem; MailAddress to1 = new MailAddress(selectedItem.Email); без 'foreach', и он отправил только одно электронное письмо на первый выбранный элемент списка.

BillWoodruff

@jsnooze @User-10673509 Привет, я думаю, что если вы объедините свои предложения в решение, я буду не единственным человеком, который поддержит его :) ура, Билл

Member 11403304

То, что отображается в списке, - это FTACaseReset.Модели.GetAdditionalStaffInfoModel даже если я указал имя как DisplayMember

j snooze

Вы уверены, что свойство GetAdditionalStaffInfoModel называется "Name", а не "DisplayName"? У вас нет кода для этого объекта, вставленного сюда, но я вижу, что DisplayName ссылается в запросе linq.

В противном случае, если это не исправит ситуацию....
У меня действительно было что-то фанковое, как это произошло со мной (у меня есть это как флажок списка)вместо использования источника данных я прибегнул к циклу for, подобному приведенному ниже(не спрашивайте меня, почему он отображает текст имени объекта против значения свойства, я использую источник данных в других списках без проблем).

foreach(GetAdditionalStaffInfoModel модель в staffEmails)
{
AdditionalStaffEmailListBox.Предметы.Добавить(модель);
}
AdditionalStaffEmailListBox.DisplayMember = "Отображаемое Имя";

Member 11403304

Вы правы. Я забыл добавить DisplayName в виде строки "". Теперь мой список заполнен именами! Да!. Следующая часть состоит в том, чтобы выбрать имя или имена и отправить электронное письмо на выбранное имя. Я дам вам знать, если застряну. Вы мне очень помогли в этом деле. Я не знаю, как вас благодарить. Без тебя я не смогу этого сделать.

BillWoodruff

это проект WinForm ?

Member 11403304

Это приложение для Windows. У меня есть бланки да

BillWoodruff

Вы можете иметь формы в нескольких .Чистые языки. Что это за проект такой ?

WinForms ? WPF ? ASP.NET -ЧТО ?

Member 11403304

Это WPF

BillWoodruff

WPF имеет расширенные возможности привязки данных по сравнению с WinForms. Ваше решение должно использовать привязку данных, которая может быть выполнена в XAML или программно (код позади).

Попробуйте: https://www.c-sharpcorner.com/uploadfile/mahesh/listbox-in-wpf/

Member 11403304

На самом деле, основываясь на предложениях j snooze, я почти закончил. Я застрял на том, как отправить более одного письма на все выбранные имена списков.

1 Ответов

Рейтинг:
7

BillWoodruff

Цитата:
Я застрял на том, как отправить более одного письма на все выбранные имена списков
В Windows Forms это было бы так просто:
private void Button1_Click(object sender, EventArgs e)
{
    IEnumerable<Employee> selItems = listBox1.SelectedItems.Cast<Employee>();

    foreach (Employee emp in selItems)
    {
        SendEMail(emp.EMail);
    }
}

private void SendEMail(string empEMail)
{
}
Код в WPF должен быть очень похожим.