当虚拟模式为true时,我想从数据库填充列表视图。它是一个有2个coulmns的ListView。可以,但是当有子项目时,没有子项目显示:
这是我的代码:
private ListViewItem[] myCache; //array to cache items for the virtual list
private int firstItem; //stores the index of the first item in the cache
DataSet ds;
SqlDataAdapter dba;
public LVCacheTest()
{
InitializeComponent();
LoadDataFromDataBase();
ListView listView1 = new ListView();
listView1.Dock = DockStyle.Fill;
listView1.View = View.SmallIcon;
listView1.GridLines = true;
listView1.VirtualMode = true;
listView1.VirtualListSize = ds.Tables[0].Rows.Count;
listView1.Columns.Add("ID", 70, HorizontalAlignment.Center);
listView1.Columns.Add("Code", 70, HorizontalAlignment.Center);
listView1.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView1_RetrieveVirtualItem);
this.Controls.Add(listView1);
//Search for a particular virtual item.
//Notice that we never manually populate the collection!
//If you leave out the SearchForVirtualItem handler, this will return null.
ListViewItem lvi = listView1.FindItemWithText("");
//Select the item found and scroll it into view.
if (lvi != null)
{
listView1.SelectedIndices.Add(lvi.Index);
listView1.EnsureVisible(lvi.Index);
}
}
private void LoadDataFromDataBase()
{
string cn="Initial Catalog=ECart;Data Source=sql2012;Integrated Security=SSPI;Persist Security Info=False";
SqlConnection SqlConnection = new SqlConnection(connectionString);
dba = new SqlDataAdapter("SELECT ID,ProjectCode FROM vwRef ", cn);
ds = new DataSet();
dba.Fill(ds, "vwRef");
}
void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
int x = 0;
ListViewItem lvi = new ListViewItem(x.ToString());
if (ds != null)
{
x = int.Parse(ds.Tables[0].Rows[e.ItemIndex].ItemArray[0].ToString());
lvi.Text = x.ToString();
ListViewItem.ListViewSubItem lvsi = new ListViewItem.ListViewSubItem();
lvsi.Text = ds.Tables[0].Rows[e.ItemIndex].ItemArray[1].ToString();
lvi.SubItems.Add(lvsi);
}
e.Item = lvi;
}
一个非常愚蠢的错误。我改变了
listView1.View = View.SmallIcon;
到
listView1.View = View.Details;
现在显示SUbitem。