【问题标题】:List of type class, adding values to a List <> of datatype CLASS类型类列表,将值添加到数据类型 CLASS 的列表 <>
【发布时间】:2011-09-24 22:40:35
【问题描述】:

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

在消息框中没有显示值?怎么办。请帮忙

//抱歉打错了:

替换这 3 行:

mc.StdDetails = readStdreader.GetString(3); 
        mc.StdDetails = readStdreader.GetDate(1);
        mc.StdDetails = readStdreader.GetDateTime(2);

与:

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

【问题讨论】:

  • 一方面,您似乎正在将所有数据库值重新分配给“myclass”的 StdDetails 属性。 StdDetails 将始终等于 readStdreader.GetDateTime(2),其余属性将为空。

标签: c# .net winforms list dynamic


【解决方案1】:

您只创建了一个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

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

另外:

  • 您应该查看 .NET 命名约定;你的名字现在遍布整个商店。 (std 在这里是什么意思?你几乎用过它...)
  • 公共领域是一个非常糟糕的主意;改用属性
  • 使用using 语句以可靠的方式关闭阅读器、命令、连接等。

【讨论】:

  • @sqlchild:在哪里?如果是 while 循环之后,可能没有任何行?
  • @Jon:关于你的问题,“Std”在他的代码中是什么意思,我的精神力量说它是“学生”的缩写。:)
  • @Sven:是的,很有可能。但这表明应该将myclass 重命名为Student 并且应该删除前缀:)
  • 先生,它给出的错误,数据库中有 10 行,然后呢?我已将消息框放在 while 循环之外,它只将一行插入到列表中,当我尝试访问第 1 行时,它会给出索引错误......这行有效:MessageBox.Show(StdList [0].StdDetails.ToString() + "\n" + StdList[0].StdAddedDate.ToString() + "\n" + StdList[0].StdAddedTime.ToString() + "\n" + StdList[0 ].StdAdderID.ToString());------------它仅适用于 0 索引,但如果我将 1 放在零的位置,那么它会给出错误
  • @sqlchild:那么它只会循环一次。在调试器中单步执行它以了解发生了什么。
【解决方案2】:

这样不行。

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

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

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

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

【讨论】:

    【解决方案3】:

    这里有两个基本问题:

    1. 您每次都在重复使用myclass 的同一个实例。这意味着您的列表一遍又一遍地包含相同的实例,并且由于每次循环迭代时都会更新该实例,因此它的值是从数据库中读取的最后一个值的值。您需要在 while 循环中执行 mc = new myclass()
    2. 您的myclass 定义不会覆盖ToString()。所以最后调用StdList[0].ToString() 只会使用默认的ToString() 实现,它返回类型名称,没有任何意义。

    【讨论】:

      【解决方案4】:

      两件事。您仅将值重新分配给 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()); 
      

      【讨论】:

        猜你喜欢
        • 2011-02-03
        • 1970-01-01
        • 2014-05-07
        • 1970-01-01
        • 1970-01-01
        • 2019-03-12
        • 2015-06-25
        • 2021-05-17
        • 2014-02-24
        相关资源
        最近更新 更多