Δυστυχώς, το ListView δεν υποστηρίζει databinding, οπότε δεν μπορείς να του περάσεις κατευθείαν ένα dataset όπως με ένα datagrid. Ο περιορισμός αυτός ισχύει από γεννησιμιού του (κάπου στα Windows 95). Θα πρέπει να περάσεις τις γραμμές μία-μία. Ευτυχώς, θα βρεις ένα άρθρο με κώδικα στο MSDN που περιγράφει πως να φτιάξεις ένα custom listview control που να υποστηρίζει databinding.
Αν αυτό σου φαίνεται φασαρία, και θέλεις να περάσεις τα δεδομένα με κώδικα μπορείς να χρησιμοποιήσεις τον παρακάτω κώδικα. Έχω συνδεθεί σε μια βάση που περιέχει ένα πίνακα MyTable με δύο στήλες:
private void LoadAndShowDataWithDataSet()
{
sqlDataAdapter1.Fill(myDataSet1.MyTable);
foreach(DataRow aRow in myDataSet1.MyTable.Rows)
{
DisplayItem(aRow[0].ToString(),aRow[1].ToString());
}
}
private void DisplayItem(string firstColumn,string secondColumn)
{
ListViewItem newItem=listView1.Items.Add(firstColumn);
newItem.SubItems.Add(secondColumn);
}
Θα πρέπει όμως να έχεις υπόψη ότι αν θέλεις να τροποποιήσεις τα δεδομένα του listview, θα πρέπει να γράψει επιπλέον κώδικα για να περάσεις τις αλλαγές στη βάση. Το custom control του MSDN καλύπτει και αυτή την περίπτωση.
Αν αυτό δεν σε ενδιαφέρει, θα μπορούσες να χρησιμοποιήσεις ένα datareader αντί για ένα dataset για να πετύχεις καλύτερη ταχύτητα πρόσβασης στη βάση:
private void LoadAndShowDataWithReader()
{
string mySelectQuery = "SELECT * FROM MyTable";
SqlConnection myConnection = new SqlConnection("integrated security=SSPI;data source=MYSQLSERVER;initial catalog=Test");
SqlCommand myCommand = new SqlCommand(mySelectQuery,myConnection);
myConnection.Open();
SqlDataReader myReader;
myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
DisplayItem(myReader.GetString(0),myReader.GetString(1));
}
myReader.Close();
myConnection.Close();
}
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos