private List<string[]> rows = new List<string[]>();
private void QueryExecute(object sender, EventArgs e)
{
SqlCommand command = new SqlCommand(SelectQueryString.Text, MyDBConnection);
SqlDataReader rd = null;
try
{
rd = command.ExecuteReader();
for (int i = 0; i < rd.FieldCount; i++)
SelectList.Columns.Add(rd.GetName(i));
string[] row = new string[rd.FieldCount];
while (rd.Read())
{
for (int i = 0; i < rd.FieldCount; i++)
row[i] = Convert.ToString(rd[$"{rd.GetName(i)}"]);
rows.Add(row);
}// После того как он выходит из цикла, все строки в rows становятся копиями последней, третьей строки.
}// И в ListView выходят абсолютно схожие записи, что, естественно, неверно.
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (rd != null && !rd.IsClosed)
rd.Close();
}
RefreshList(rows);
}
private void RefreshList(List<string[]> list)
{
SelectList.Items.Clear();
foreach (string[] s in list)
SelectList.Items.Add(new ListViewItem(s));
}
string[] row = new string[rd.FieldCount];
while (rd.Read())
{
rows.Add(row.Clone());
With reference types, two variables can reference the same object; therefore, operations on one variable can affect the object referenced by the other variable.. Точнее, что такое reference type потребует отладчик и работу с MSIL. Вот как описывает reference type MSIL standard:
По этой причине, не смотря на то, что вы трижды сместили строку в DataReader, запись каждый раз производилась в один и тот же блок данных, переписывая его, а три записи в неизвестной лист были обращены к одному и тому же блоку.
I.8.2.1 Value types and reference types
There are two kinds of types: value types and reference types.
[...]
Reference types –A value described by a reference type denotes the location of another
value.