类型类的列表,将值添加到List<>;数据类型为CLASS
本文关键字:gt lt 数据类型 CLASS List 列表 添加 类型 | 更新日期: 2023-09-27 18:00:51
我正在从数据库表中检索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
的一个实例,因此您的列表将充满对同一对象的引用。你想要这个:
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
语句以可靠的方式关闭读卡器、命令、连接等
它不是这样工作的。
首先,必须将MyClass mc = new MyClass();
移动到while
中,因为每次都必须创建一个新实例,而不能更改现有实例。
其次,调用StdList[0].ToString();
只会输出MyClass
名称,因为您没有为ToString()
方法提供重写。
第三,在while
中,您总是使用StdDetails
属性,但我认为这是一个拼写错误,因为它无法编译(您第三次和第四次将字符串分配给DateTime,编译器不喜欢它(。
请尝试在消息框中使用StdList[0].StdDetails
而不是StdList[0].ToString()
。
这里有两个基本问题:
- 您每次都在重用
myclass
的同一实例。这意味着您的列表一遍又一遍地包含相同的实例,并且由于每次循环迭代时都会更新该实例,因此它的值是从DB中读取的最后一个值。你需要在while循环中做一个mc = new myclass()
- 您的
myclass
定义不会覆盖ToString()
。因此,在最后调用StdList[0].ToString()
将只使用默认的ToString()
实现,它返回类型名称,而没有任何意义
两件事。您只将值重新分配给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());