Список типов классов, добавление значений в список <> типа данных CLASS - PullRequest
0 голосов
/ 29 июня 2011

Я получаю 4 поля из таблицы базы данных.Теперь я хочу добавить их в динамический список <>.Как добавить их в список.Я пробовал это:

public class myclass
{
   public string StdDetails, StdAdderID;
   public DateTime StdAddedDate, StdAddedTime;
}

public void buttonClick()
{
    List<myclass> StdList = new List<myclass>();

    myclass mc = new myclass();

    OdbcCommand readStd = 
        new OdbcCommand("SELECT StdDetails, StdAddedDate," +
                        "StdAddedTime, StdAdderID" +
                        "FROM Students", Conn);

    OdbcDataReader readStdreader = 
        readStd.ExecuteReader(CommandBehavior.SingleRow);

    while (readStdreader .Read())
    {
        mc.StdDetails = readStdreader.GetString(0);
        mc.StdDetails = readStdreader.GetString(3); 
        mc.StdDetails = readStdreader.GetDate(1);
        mc.StdDetails = readStdreader.GetDateTime(2);
        StdList.Add(mc);
    }
    MessageBox.Show(StdList[0].ToString());
}

В окне сообщения значение не отображается?Что делать.

Ответы [ 4 ]

7 голосов
/ 29 июня 2011

Вы создаете только один экземпляр из myclass, поэтому ваш список будет полон ссылок на один и тот же объект.Вместо этого вы хотите:

while (readStdreader.Read())
{
    myclass mc = new myclass();
    mc.StdDetails = readStdreader.GetString(0);
    mc.StdAdderID = readStdreader.GetString(3);
    mc.StdAddedDate= readStdreader.GetDate(1);
    mc.StdAddedTime = readStdreader.GetDateTime(2);
    StdList.Add(mc);
}

Обратите внимание, как я также изменил присваиваемые свойства - код, который вы опубликовали, пытается присвоить StdDetails несколько раз.не переопределяется ToString в myclass, поэтому вызов ToString() не даст вам ничего особенно полезного.

Дополнительно:

  • Вы должны посмотретьСоглашения об именах в сети;Ваше наименование в данный момент распространяется по всему магазину.(Что здесь означает std? Вы использовали это почти для всего ...)
  • Открытые поля - действительно плохая идея;вместо этого используйте свойства
  • Используйте операторы using, чтобы надежно закрыть читатели, команды, соединения и т. д.
2 голосов
/ 29 июня 2011

Так не работает.

Во-первых, вы должны переместить MyClass mc = new MyClass(); в while, потому что вы должны каждый раз создавать новый экземпляр, а не изменять существующий.

Во-вторых, вызов StdList[0].ToString(); просто выведет имя MyClass, так как вы не предоставили переопределение для метода ToString().

В-третьих, в вашем while вы всегда используете свойство StdDetails, но я думаю, что это опечатка, поскольку она не будет компилироваться (вы присваиваете String для DateTime в третий и четвертый раз и компилятору это не нравится).

Попробуйте с StdList[0].StdDetails вместо StdList[0].ToString() в окне сообщения.

1 голос
/ 29 июня 2011

Две вещи. Вы повторно присваиваете значения только свойству StdDetails myclass, и у вас нет доступа к какому-либо конкретному свойству в MessageBox. Нужно сделать:

 while (readStdreader .Read())    
 {        
    myclass mc = new myclass(); 
    mc.StdDetails = readStdreader .GetString(0);        
    mc.StdAdderID = readStdreader .GetString(3);        
    mc.StdAddedDate = readStdreader .GetDate(1);        
    mc.StdAddedDate = readStdreader .GetDateTime(2);        
    StdList.Add(mc);    
 } 

 MessageBox.Show(StdList[0].StdDetails.ToString()); 
1 голос
/ 29 июня 2011

Здесь есть две фундаментальные проблемы:

  1. Вы повторно используете один и тот же экземпляр myclass каждый раз.Это означает, что ваш список содержит один и тот же экземпляр снова и снова, и, поскольку вы обновляете этот экземпляр каждый раз, когда цикл повторяется, его значением является значение последнего значения, считанного из БД.Вам нужно сделать mc = new myclass() внутри цикла while.
  2. Ваше определение myclass не отменяет ToString().Поэтому при вызове StdList[0].ToString() в конце будет использоваться реализация ToString() по умолчанию, которая возвращает имя типа, а не что-либо значимое.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...