我有这段代码从数据库中检索数据但我的问题是它只显示我ListViewItem
上的最后一项。这是代码:
private void patientLvw_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
cmd = new OleDbCommand("SELECT * FROM PATIENTS ORDER BY PATIENTS.PatientNo;", conn);
reader = cmd.ExecuteReader();
while (reader.Read())
{
String patientNo = ""; ;
String lastName = "";
String firstName = "";
String middleInitial = "";
String age = "";
String address = "";
String type = "";
String status = "";
if (!reader.IsDBNull(0))
{
patientNo = reader.GetInt32(0).ToString();
}
if (!reader.IsDBNull(1))
{
lastName = reader.GetString(1);
}
if (!reader.IsDBNull(2))
{
firstName = reader.GetString(2);
}
if (!reader.IsDBNull(3))
{
middleInitial = reader.GetString(3);
}
if (!reader.IsDBNull(4))
{
age = reader.GetInt32(4).ToString();
}
if (!reader.IsDBNull(5))
{
address = reader.GetString(5);
}
if (!reader.IsDBNull(6))
{
type = reader.GetString(6);
}
if (!reader.IsDBNull(7))
{
status = reader.GetBoolean(7).ToString();
}
ListViewItem lvi = new ListViewItem(patientNo);
e.Item.SubItems.Add(lastName);
e.Item.SubItems.Add(firstName);
e.Item.SubItems.Add(middleInitial + ".");
e.Item.SubItems.Add(age);
e.Item.SubItems.Add(address + ".");
e.Item.SubItems.Add(type);
e.Item.SubItems.Add(status);
e.Item = lvi;
}
}
答案 0 :(得分:0)
为每个项目调用RetreiveVirtualItem,并且每次调用每个患者时都会循环。您每次都会覆盖e.Item,因此每个项目都以最后一组值结束。
您需要检查e.ItemIndex
并仅检索该特定行的数据。
或者您可能实际上并不想使用虚拟模式,您应该在启动时执行一次查询并手动将它们全部添加到列表中。
编辑前的答案:
另外,为什么要创建两个ListViewItem?我认为你的代码应该是这样的:
e.Item = new ListViewItem(patientNo);
if (status.Equals("Yes"))
{
e.Item.ForeColor = Color.Red;
}
e.Item.SubItems.Add(lastName);
e.Item.SubItems.Add(firstName);
e.Item.SubItems.Add(middleInitial + ".");
e.Item.SubItems.Add(age));
e.Item.SubItems.Add(address + ".");
e.Item.SubItems.Add(type);
e.Item.SubItems.Add(status);