Как добавить определенный столбец в элемент списка? - PullRequest
5 голосов
/ 10 августа 2009

Я создаю список и количество столбцов определяется во время выполнения. Я читаю тексты в Интернете о просмотре списка (и я до сих пор), но я хочу знать, как добавить элементы в определенный столбец в просмотре списка, я подумал что-то вроде:

m_listview.Items.Add("1850").SubItems.Add("yes");

будет работать при условии, что "1850" , который является текстом столбца, будет целевым столбцом.

Ответы [ 6 ]

18 голосов
/ 10 августа 2009

ListViewItems не знают о ваших столбцах ListView.

Чтобы напрямую ссылаться на столбец, сначала необходимо добавить все столбцы в ListViewItem.

Итак ... допустим, у вашего ListView есть три столбца A, B и C; Следующий бит кода добавит данные только в столбец A:

ListViewItem item = new ListViewItem();
item.text = "Column A";

m_listView.Items.Add(item);

Чтобы заставить его добавить текст в столбец C, сначала нужно сказать ему, что у него есть столбец B ...

ListViewItem item = new ListViewItem();
item.text = "Column A";
item.SubItems.Add("");
item.SubItems.Add("Column C");

m_listView.Items.Add(item);

Так что теперь у нас будут столбцы A, B и C в ListViewItem и текст, появляющийся в столбцах A и C, но не B.

Наконец ... теперь, когда мы сказали, что у него есть три столбца, мы можем делать с этими конкретными столбцами все, что захотим ...

ListViewItem item = new ListViewItem();
item.text = "Column A";
item.SubItems.Add("");
item.SubItems.Add("Column C");

m_listView.Items.Add(item);

m_listView.Items[0].SubItems[2].Text  = "change text of column C";
m_listView.Items[0].SubItems[1].Text  = "change text of column B";
m_listView.Items[0].SubItems[0].Text  = "change text of column A";

надеюсь, это поможет!

6 голосов
/ 10 августа 2009

Обычно я наследую ListViewItem как:

public class MyOwnListViewItem : ListViewItem 
{
    private UserData userData;

    public MyOwnListViewItem(UserData userData) 
    {
        this.userData = userData;
        Update();
    }

    public void Update() 
    { 
       this.SubItems.Clear(); 
       this.Text = userData.Name; //for first detailed column

       this.SubItems.Add(new ListViewSubItem(this, userData.Surname)); //for second can be more
    }
}

где

public class UserData 
{
   public string Name;
   public string Surname;
}

с использованием

listView1.Items.Add(new MyOwnListViewItem(new UserData(){Name="Name", Surname = "Surname"}));
1 голос
/ 28 января 2011

Это то, что я делаю, потому что столбцы добавляются во время выполнения через предпочтения пользователя.

Я использую listView для отображения информации из базы данных пользователю. (Я, вероятно, должен был бы использовать DataGrid, но когда я впервые сделал программу, DataGrid не имела встроенного полного выбора строк, и я был слишком большим новичком, чтобы просмотреть примеры пользовательских элементов управления, которые я нашел)

Пользователь выбирает, какие столбцы он хочет отобразить из общего количества, каков его размер и текст заголовка.

Я создал таблицу пользовательских настроек, в которой сохранена информация о столбцах для добавления

  • ColumnVisible = bool
  • ColumnText = string = текст для отображения в заголовке
  • columnWidth = int
  • ColumName = string = точное имя, на которое этот столбец будет ссылаться в моей другой базе данных
  • ColumnIndex = int = индекс отображения столбца

Я также создал класс ColumnPreferences и добавил свойство для каждого из этих столбцов

Использовал DataReader для создания List<ColumnPreferences>

Я сортирую этот список в соответствии с индексом отображения, поэтому я могу перебирать его в порядке отображения столбцов.

Я выполняю оператор if, проверяя, видимы ли следующие предпочтения в настройках.

Если это так, я добавляю столбец, используя ListView1.Columns.Add(ColumnName, ColumnText, ColumnWidth);

На этом этапе все столбцы установлены, чтобы сохранить место, куда пользователь перетаскивает их, чтобы я сделал в основном обратное. Я перебираю все столбцы в Listview.columns и сохраняю индекс отображения столбца и ширину столбца обратно в мою таблицу пользовательских настроек

При загрузке фактических данных из таблицы я использую тот же список предпочтений столбцов, чтобы проверить, следует ли мне отображать данные.

он снова отсортирован по индексу отображения, я проверяю, видим ли он, если нет, пропускаю его и перехожу к следующему

если это видно, я использую myDataReader[ ColumnPreference.ColumnName ], чтобы найти подходящий порядковый номер для данных, которые я хочу.

Я просто добавляю каждый из этих результатов по порядку к элементу / подпунктам представления списка, а затем добавляю их к представлению списка

1 голос
/ 10 августа 2009
ListViewItem item = new ListViewItem("foo");
item.SubItems.Add("foo2");
this.listView1.Items.Add(item);

ListViews не поддерживают привязку данных и строго типизированные имена. Я бы порекомендовал рассмотреть возможность использования вместо DataGridView. В зависимости от того, что вам нужно, это может сэкономить вам немного здравомыслия.

У Черникова это хорошо реализовано, чтобы сделать вещи немного более разумными.

0 голосов
/ 29 мая 2018
 For i = 0 To listAcheivments.Items.Count - 1
    Dim arrparam2(,) As String
    arrparam2 = New String(,) {{"@emp_code", txtEmpCode.Text}, {"@ach_year", CDate("01-01-" & listAcheivments.Items(i).SubItems(0).Text)}, {"@acheivement", listAcheivments.Items(i).SubItems(1).Text}}

    SaveData(arrparam2, "insert_acheivements")

Next
0 голосов
/ 10 августа 2009

Что-то вроде этого может быть?

ListViewItem item = m_listview.Items.Add("1850");
item.Subitems.Add(string.Empty); //Make an add method that does this for every column you got and then you can use the indexer below.
item.Subitems[1].Text = "Test";

Индекс 0 является основным элементом. Индекс 1> это подпункты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...