C# 类型类列表,向数据类型类列表添加值
我正在从数据库表中检索4个字段。现在我想把它们添加到一个动态列表中。如何将这些添加到列表中。 我试过这个: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&
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());