C# 类型类列表,向数据类型类列表添加值

C# 类型类列表,向数据类型类列表添加值,c#,.net,winforms,list,dynamic,C#,.net,Winforms,List,Dynamic,我正在从数据库表中检索4个字段。现在我想把它们添加到一个动态列表中。如何将这些添加到列表中。 我试过这个: public class myclass { public string StdDetails, StdAdderID; public DateTime StdAddedDate, StdAddedTime; } public void buttonClick() { List<myclass> StdList = new List<myclass&

我正在从数据库表中检索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());
}
与:

mc.StdAddedDate= readStdreader.GetString(3); 
                mc.StdAdderID= readStdreader.GetDate(1);
                mc.StdAddedTime= readStdreader.GetDateTime(2);

您只创建了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);
}
请注意我是如何更改分配的属性的——您发布的代码试图重复分配给stddeails

您还没有在myclass中重写ToString,因此调用ToString不会给您带来任何特别有用的东西

此外:

您应该了解.NET命名约定;你的名字现在已经传遍了整个商店。性病在这里是什么意思?你已经用它做了几乎所有的事情。。。 公共领域是一个非常糟糕的主意;改为使用属性 使用语句以可靠的方式关闭读卡器、命令、连接等。
这里有两个基本问题:

您每次都在重用同一个myclass实例。这意味着您的列表多次包含同一个实例,并且由于每次循环迭代时都会更新该实例,因此它的值是从DB读取的最后一个值。您需要在while循环中执行mc=newmyclass。 您的myclass定义没有覆盖ToString。因此,在最后调用StdList[0].ToString将只使用默认的ToString实现,它返回类型名,而不是任何有意义的内容。
它不是那样工作的

首先,您必须移动MyClass mc=newmyclass;在while内部,因为您必须每次创建一个新实例,而不是更改现有实例

第二,调用StdList[0].ToString;将只输出MyClass名称,因为您没有为ToString方法提供重写

第三,在您的应用程序中,虽然您总是使用StdDetails属性,但我认为这是一个输入错误,因为它不会编译,您将第三次和第四次为日期时间分配字符串,而编译器不喜欢它


尝试使用StdList[0]。StdDetails而不是StdList[0]。t在消息框中字符串。

两件事。您只将值重新分配给myclass的StdDetails属性,并且不访问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()); 

首先,看起来您正在将所有数据库值重新分配给“myclass”的StdDetails属性。StdDetails将始终等于readstDrader.GetDateTime2,其余属性将为null。@sqlchild:Where?如果是在while循环之后,也许就没有任何争吵了?@Jon:关于你的问题,Std在他的密码中是什么意思,我的灵力说它是student的缩写:@斯文:是的,很有可能。但这意味着myclass应该改名为Student,前缀应该删除:先生,它的给定错误,我在数据库中有10行,那么呢?我已将消息框放在while循环之外,它只在列表中插入一行,当我尝试访问第1行时,它会给出索引错误……。此行有效:MessageBox.ShowStdList[0]。StdDetails.ToString+\n+StdList[0]。StdAddedDate.ToString+\n+StdList[0]。StdAddedTime.ToString+\n+StdList[0].StdAdderID.ToString;----它只对0索引有效,但如果我将1替换为0,则它会给出error@sqlchild:那么它只遍历一次循环。在调试器中逐步遍历它以了解发生了什么。
 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());