Как получить значение электронной почты из объекта в списке?
У меня есть список, в котором отображаются имя и фамилия. Каждый элемент в списке является объектом. Это означает, что даже если я показываю имена (потому что пользователю легче смотреть на список имен, а не на электронные письма), можно получить электронную почту от каждого выбранного имени (объекта). Я не знаю, как это сделать.
Мой вопрос заключается в том, как я могу получить электронное письмо, связанное с выбранным именем (элемент в списке)?
Что я уже пробовал:
Проблема с моим кодом заключается в том, что 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, я почти закончил. Я застрял на том, как отправить более одного письма на все выбранные имена списков.