首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型类的列表,将值添加到数据类型类的列表<>

类型类的列表,将值添加到数据类型类的列表<>
EN

Stack Overflow用户
提问于 2011-06-29 16:14:45
回答 4查看 5.7K关注 0票数 0

我正在从我的数据库表中检索4个字段。现在我想把它们添加到一个动态列表<>中。如何将它们添加到列表中。我试过这个:

代码语言:javascript
复制
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());
}

是否在消息框中不显示该值?what to do.please帮助

//对于拼写错误,很抱歉:

替换这3行:

代码语言:javascript
复制
mc.StdDetails = readStdreader.GetString(3); 
        mc.StdDetails = readStdreader.GetDate(1);
        mc.StdDetails = readStdreader.GetDateTime(2);

通过以下方式:

代码语言:javascript
复制
mc.StdAddedDate= readStdreader.GetString(3); 
                mc.StdAdderID= readStdreader.GetDate(1);
                mc.StdAddedTime= readStdreader.GetDateTime(2);
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-29 16:20:17

您只创建了一个myclass实例,因此您的列表将充满对同一对象的引用。您需要的是以下内容:

代码语言:javascript
复制
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

您还没有在myclass中覆盖ToString,所以调用ToString()不会给您带来任何特别有用的东西。

此外:

  • 你应该研究一下.NET的命名约定;你的名字现在到处都是。( std在这里是什么意思?您已经将其用于几乎everything...)
  • Public字段是一个非常糟糕的主意;使用属性代替
  • 使用using语句以可靠的方式关闭读取器、命令、连接等。
票数 7
EN

Stack Overflow用户

发布于 2011-06-29 16:20:29

它不是这样工作的。

首先,您必须在while中移动MyClass mc = new MyClass();,因为您每次都必须创建一个新实例,并且不能更改现有实例。

其次,调用StdList[0].ToString();只会输出MyClass名称,因为您没有为ToString()方法提供覆盖。

第三,在您的while中,您总是使用StdDetails属性,但我认为这是一个拼写错误,因为它无法编译(您在第三次和第四次将一个字符串分配给DateTime,而编译器不喜欢这样)。

尝试在消息框中使用StdList[0].StdDetails而不是StdList[0].ToString()

票数 2
EN

Stack Overflow用户

发布于 2011-06-29 16:20:28

这里有两个基本问题:

  1. 您每次都在重用相同的myclass实例。这意味着您的列表一遍又一遍地包含相同的实例,由于每次循环迭代时都会更新该实例,因此它的值是从DB读取的最后一个值。你需要在你的while循环中做一个mc = new myclass()
  2. 你的myclass定义不会覆盖ToString()。因此,在最后调用StdList[0].ToString()将只使用默认的ToString()实现,它返回类型名称,而不是任何有意义的内容。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6517574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档