从列表框中获取所选项目

时间:2014-08-18 12:22:56

标签: c# winforms

我的问题非常奇怪,我正在尝试将一个字符串写入列表中的所选项目,并且我的字符串始终为空。

这是我的代码:

void loader(MethodInfo[] methArr)
{
    //string abba = "";

    listBox1.Items.Clear();

    //loop
    for (int i = 0; i < methArr.Length; i++)
    {
         ab = ab.AppendLine(methArr[i].ToString());
         //abba = ab.ToString();
         listBox1.Items.Add(ab);
         ab.Clear();
    }


}

private void button1_Click(object sender, EventArgs e)
{
    checker();
}

private void button2_Click(object sender, EventArgs e)
{

    string a = listBox1.GetItemText(listBox1.SelectedItem.ToString());
    string b = listBox1.SelectedItem.ToString();
    string c = "dummy";
    MessageBox.Show(a + b + c);
}

如果我使用SelectedIndex,它会显示索引,但否则我只会得到C字符串

这是我的完整代码:http://pastebin.com/i0McETZz

enter image description here

DEBUG - EDIT2 enter image description here

5 个答案:

答案 0 :(得分:4)

不要将字符串构建器添加到列表中,该列表构建器是对象集合的对象引用。使用ToString()方法(正如您已注释掉的那样)

见这个例子:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            StringBuilder builder = new StringBuilder();

            for (int i = 0; i < 10; i++)
            {
                builder.Append(i);
                listBox1.Items.Add(builder);
                builder.Clear();
            }

            for (int i = 0; i < 10; i++)
            {
                builder.Append(i);
                listBox2.Items.Add(builder.ToString());
                builder.Clear();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            string a = listBox1.GetItemText(listBox1.SelectedItem.ToString());
            string b = listBox1.SelectedItem.ToString();
            string c = listBox1.GetItemText(listBox1.SelectedItem);
            string d = listBox2.GetItemText(listBox2.SelectedItem.ToString());
            string f = listBox2.SelectedItem.ToString();
            string g = listBox2.GetItemText(listBox2.SelectedItem);
            MessageBox.Show("1:" + a + b + c + "\r\n2: " + d+ f + g);
        }
    }
}

enter image description here

答案 1 :(得分:2)

如果要检索项目的显示文本,请使用GetItemText方法:

string text = listBox1.GetItemText(listBox1.SelectedItem);

答案 2 :(得分:2)

这是因为您添加项目的方式而不是您检索项目的方式。

当您致电listBox1.Items.Add(ab);时,您要将实例 ab添加到listbox。这意味着您在列表框中有ab的4个引用,但由于ab调用,ab.Clear()为空。文本必须在添加到列表框时设置为ab的值,但是当您检索引用的项目时,您将获得当前 ab为空。

要解决这个问题,您可以在循环的每次迭代中创建一个新的StringBuilder并删除对Clear()的调用:

for (int i = 0; i < methArr.Length; i++)
{
    StringBuilder ab = new StringBuilder();    
    ab = ab.AppendLine(methArr[i].ToString());
    listBox1.Items.Add(ab);
}

或者使用StringBuilder的ToString()方法:

StringBuilder ab = new StringBuilder();                
for (int i = 0; i < methArr.Length; i++)
{

    ab = ab.AppendLine(methArr[i].ToString());
    listBox1.Items.Add(ab.ToString());
    ab.Clear();
}

答案 3 :(得分:1)

我猜您使用的是a multiple-selection ListBox,因此,您应该使用ListBox.SelectedItems,并迭代收到的项目以单独打印。

答案 4 :(得分:1)

您只需要将所选项目添加到ListBoxItem,然后将内容分配给您需要的字符串:

            ListBoxItem listboxitem = (ListBoxItem) ListBox1.SelectedItem;
            string a = listboxitem.Content.ToString();

这对我有用,希望有所帮助