2016-12-06 2 views
0

Как и название, я пытаюсь заполнить список в приложении WPF информацией из csv. В идеале я хочу отображать каждую строку из csv, но только определенные столбцы, то есть с данными о пригодности, у меня было бы имя, фамилия, DOB, пол и т. Д., Но я бы отображал только имя и фамилию. Мой код выглядит следующим образом:Заполнение списка из csv через список <>

public partial class PatientList : Window 
{ 
    int x = 0; 
    public PatientList() 
    { 
     InitializeComponent(); 
     HumanResources ListAllPatients = new HumanResources(); 
     List<PatientInformation> AllPatients = ListAllPatients.PopPatientList(); 

     foreach (PatientInformation PatientChoice in AllPatients) 
     { 
      lboxPatients.Items.Add(AllPatients[x]); 
      x += 1; 
     } 
    } 

класс людских ресурсов

public List<PatientInformation> PopPatientList() 
    { 
     DataAccess PatientList4Doc = new DataAccess(); 
     List<PatientInformation> DocsPatients = PatientList4Doc.ListofPatients(); 
     return DocsPatients; 
    } 

доступа к данным класса

class DataAccess 
{ 
    public List<PatientInformation> ListofPatients() 
    { 
     List<PatientInformation> ListofPatients = new List<PatientInformation>(); 
     string[] UserData = File.ReadAllLines("UserList.csv"); 

     foreach (string Person in UserData) 
     { 
      string[] PersonInfo = Person.Split(','); 
      PatientInformation Patient = new PatientInformation() 
      { 
       Username = PersonInfo[0].ToUpper(), 
       LastName = PersonInfo[1], 
       FirstName = PersonInfo[2], 
       DOB = Convert.ToDateTime(PersonInfo[3]), 
       Gender = Convert.ToChar(PersonInfo[4]), 
       Height = Convert.ToInt16(PersonInfo[5]), 
       Weight = Convert.ToInt16(PersonInfo[6]), 
       CaloricIntake = PersonInfo[7], 
       WaterDrank = PersonInfo[8], 
       CaloriesBurned = PersonInfo[9], 
       TimeSlept = PersonInfo[10], 
       ContextMessage = PersonInfo[11], 
       Replymessage = PersonInfo[12] 
      }; 
      ListofPatients.Add(Patient); 
     } 
     return ListofPatients; 
    } 

Информация для пациентов Класс

public class PatientInformation 
{ 
    public string Username { get; set; } 
    public string LastName { get; set; } 
    public string FirstName { get; set; } 
    public DateTime DOB { get; set; } 
    public char Gender { get; set; } 
    public int Height { get; set; } 
    public int Weight { get; set; } 
    public string CaloricIntake { get; set; } 
    public string WaterDrank { get; set; } 
    public string CaloriesBurned { get; set; } 
    public string TimeSlept { get; set; } 
    public string ContextMessage { get; set; } 
    public string Replymessage { get; set; } 
} 

Все работает отлично, пока я не пытаться заполнить l istbox. Когда я пытаюсь прочитать информацию, все, что я получаю, это путь кода, а не желаемая информация. Мой вопрос: как только я получаю всю информацию, полученную из CSV, как я могу затем распечатать ее в списке и показать, как она работает с PatientInformation? Заранее спасибо за любую помощь

This is what I'm getting

EDIT

@Hypnos: Я реализовал свое предложение следующим образом:

I tried implementing your example like so: HumanResources ListAllPatients = new HumanResources(); 
     List<PatientInformation> AllPatients = ListAllPatients.PopPatientList(); 
     List<PatientInformation> p = new List<PatientInformation>(); 
     p.Add(new PatientInformation() { Username = Convert.ToString(AllPatients[0]), FirstName = Convert.ToString(AllPatients[2]), LastName = Convert.ToString(AllPatients[1]) }); 

     lboxPatients.ItemsSource = p; 

Однако это возвращает исключение «Index был из диапазон должен быть неотрицательным и меньше размера коллекции "

ответ

0

ListBox понятия не имеет столбцы, так что я предполагаю, что вы хотите отобразить простые линии строк в нем. Затем можно просто добавить строки в коллекции Items:

public PatientList() 
    { 
     InitializeComponent(); 
     HumanResources ListAllPatients = new HumanResources(); 
     List<PatientInformation> AllPatients = ListAllPatients.PopPatientList(); 

     foreach (PatientInformation PatientChoice in AllPatients) 
     { 
      lboxPatients.Items.Add(string.Format("{0};{1}", PatientChoice.FirstName, PatientChoice.LastName)); 
     } 
    } 

Если вы хотите, чтобы отобразить фактические столбцы с заголовками можно использовать ListView:

 <ListView x:Name="lv"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding FirstName}" /> 
       <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding LastName}" /> 
      </GridView> 
     </ListView.View> 
    </ListView> 

    public PatientList() 
    { 
     InitializeComponent(); 
     HumanResources ListAllPatients = new HumanResources(); 
     List<PatientInformation> AllPatients = ListAllPatients.PopPatientList(); 
     lv.ItemsSource = AllPatients; 
    } 
0

Я думаю, вы должны настроить свой DataItem DataTemplate. Посмотрите на этот образец:

В коде позади, по практическим причинам, я создать новый список, добавив запись в нем

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     List<PatientInformation> p = new List<PatientInformation>(); 
     p.Add(new PatientInformation() { Username = "John", FirstName ="John", LastName = "Doe" }); 

     listBox.ItemsSource = p; 
    } 

XAML стороны, для конкретных полей, мы могли бы сделать вещь как то:

 <ListBox x:Name="listBox" HorizontalAlignment="Left" Height="291" VerticalAlignment="Top" Width="497" Margin="10,10,0,0" DataContext="{Binding}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel HorizontalAlignment="Stretch"> 
        <TextBlock Text="{Binding FirstName}"/> 
        <TextBlock Text="{Binding LastName}"/> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

Как вы можете видеть, отдельно от DataContext = {Binding} на самом ListBox, я создал настраиваемый DataTemplate для ListItem (ов) для того, чтобы сориентировать связывание с его свойствами , на элементах управления, которые я хочу. В моем случае два текстовых блока, которые будут раскрывать свойства FirstName и LastName.

Надеется, что это помогает

Смежные вопросы