2013-12-07 3 views
2

Я искал решение с утра, и даже после прочтения тонны других потоков по этому вопросу он не работает для меня. Без дальнейших АДА давайте проверим этот образец кода:Как программно выбрать элементы ListView?

// Create Dictionary, Keys = Ids, Values = Names 

Dictionary<int, string> ff_names = new Dictionary<int, string>(); 
ff_names.Add(0, "Cloud"); 
ff_names.Add(1, "Barret"); 
ff_names.Add(2, "Tifa"); 
ff_names.Add(3, "Aerith"); 
ff_names.Add(4, "Red XIII"); 

// Populating ListView 

foreach(KeyValuePair<int, string> dict in ff_names) 
{ 
    ListViewItem lvi = new ListViewItem(dict.Key.ToString()); 
    lvi.SubItems.Add(dict.Value); 

    listView1.Items.Add(lvi); 
} 

// Test Item Selection 

listView1.Focus(); 
listView1.Select(); 
listView1.Items[0].Focused = true; 
listView1.Items[0].Selected = true; 

string s = listView1.SelectedItems.Count.ToString(); 

label1.text = s; // sadly, it's equal to 0; 
textBox1.Text = listView1.SelectedItems[0].SubItems[0].Text; // program will crash 

Технически, я хотел бы выбор тот или иной элемент управления ListView и отображать один из его элементов в текстовом поле. Он работает, когда я выбираю элемент вручную, но когда я пытаюсь выбрать программно, как показано выше, он не хочет ничего выбирать, значение SelectedItems равно нулю ...

Благодарим вас за помощь и надежду может найти решение того, что мне не хватает!

+2

копия литературном вставили код и он работал на меня. Метка1 даже показала «1». –

+2

То же. Есть ли у вас какие-либо обработчики событий в спискеView, которые могли бы сбивать с толку? –

+0

На самом деле, я использую форму, которая наследуется от другой формы, которая содержит элемент управления listview, но, как я уже сказал, когда я выбираю listview вручную с помощью мыши, он работает. – TheScholar

ответ

1

Здесь вы идете. Вам нужно будет обработать событие для listView1_SelectedIndexChanged.

public Form1() { 
     InitializeComponent(); 
     listView1.View = View.Details; 
     listView1.Columns.Add("Key"); 
     listView1.Columns.Add("Value"); 
     LoadListView(); 
    } 

    private void LoadListView() { 
     // Create Dictionary, Keys = Ids, Values = Names 

     Dictionary<int, string> ff_names = new Dictionary<int, string>(); 
     ff_names.Add(0, "Cloud"); 
     ff_names.Add(1, "Barret"); 
     ff_names.Add(2, "Tifa"); 
     ff_names.Add(3, "Aerith"); 
     ff_names.Add(4, "Red XIII"); 

     // Populating ListView 

     foreach (KeyValuePair<int, string> dict in ff_names) { 
      ListViewItem lvi = new ListViewItem(new string[] { dict.Key.ToString(), dict.Value }); 
      listView1.Items.Add(lvi); 
     } 

     // Test Item Selection 

     listView1.Focus(); 
     listView1.Select(); 
     listView1.Items[0].Focused = true; 
     listView1.Items[0].Selected = true; 

    } 

    private void listView1_SelectedIndexChanged(object sender, EventArgs e) { 
     if (listView1.SelectedItems.Count > 0) { 
      label1.Text = (string)listView1.SelectedItems[0].Text; // sadly, it's equal to 0; 
      textBox1.Text = (string)listView1.SelectedItems[0].SubItems[1].Text; 
     } 
    } 
+0

Спасибо, я проверю ваш пример и посмотрю, устранит ли он мою проблему. – TheScholar

+0

Добро пожаловать! – drankin2112

+0

Сравнивая свою версию с моим, кажется, ничего не происходит с «listView1.Items [0] .Selected = true» до тех пор, пока событие не будет выброшено, и поскольку мой код был в contructor winform, видимо, было слишком рано, чтобы SelectedItems содержит что-то. Благодарим за отправку вашей версии! – TheScholar

0

Я думаю, что ответ drankin2112 является полезным, но вы говорите, что не работает, поэтому я дополняю его, надеюсь, что это может быть полезным для вас. Чтобы закончить работу, вам необходимо сделать три следующих действия: 1. загрузить данные и заполнить listview; 2.define метод процесса при изменении выбранного элемента списка; 3. Установите тестовый метод для программного выбора другого элемента, вы можете увидеть результат. мой пример кода ниже:

public MainWindow() 
    { 
     InitializeComponent(); 

     listView1.View = View.Details; 
     listView1.Columns.Add("Key"); 
     listView1.Columns.Add("Value"); 
     this.listView1.FullRowSelect = true; 
     //register the process event 
     this.listView1.SelectedIndexChanged += this.listView1_SelectedIndexChanged; 
     //load data 
     LoadListView(); 
     //test item selection 
     ToSelectItem(0); 
    } 

    void ToSelectItem(int itemIndex) 
    { 
     if (itemIndex > listView1.Items.Count - 1) 
      return; 
     listView1.Focus(); 
     listView1.Select(); 
     listView1.Items[itemIndex].Focused = true; 
     listView1.Items[itemIndex].Selected = true; 
    } 

    private void LoadListView() 
    { 
     // Create Dictionary, Keys = Ids, Values = Names 

     Dictionary<int, string> ff_names = new Dictionary<int, string>(); 
     ff_names.Add(0, "Cloud"); 
     ff_names.Add(1, "Barret"); 
     ff_names.Add(2, "Tifa"); 
     ff_names.Add(3, "Aerith"); 
     ff_names.Add(4, "Red XIII"); 

     // Populating ListView 

     foreach (KeyValuePair<int, string> dict in ff_names) 
     { 
      ListViewItem lvi = new ListViewItem(new string[] { dict.Key.ToString(), dict.Value }); 
      listView1.Items.Add(lvi); 
     } 

    } 

    private void listView1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (listView1.SelectedItems.Count > 0) 
     { 
      label1.Text = (string)listView1.SelectedItems[0].Text; // sadly, it's equal to 0; 
      textBox1.Text = (string)listView1.SelectedItems[0].SubItems[1].Text; 
     } 
    } 

the result of my test app

+0

Эй, Скотт, спасибо, я проверю его, когда вернусь домой! Пример выглядит так, как будто он будет отвечать на мой вопрос напрямую. – TheScholar

Смежные вопросы