C# 从列表框中获取所选项目

C# 从列表框中获取所选项目,c#,winforms,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());

我的问题很奇怪,我试图将列表中的选定项写入字符串,而我的字符串总是空的

这是我的代码:

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);
}
void加载器(MethodInfo[]methArr)
{
//字符串abba=“”;
listBox1.Items.Clear();
//环路
对于(int i=0;i
如果我使用SelectedIndex,它会显示索引,否则我只会得到C字符串

这是我的完整代码:

调试-编辑2

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

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

我猜您正在使用,因此,您应该以这种方式使用ListBox。选择EdItems,并对收到的项目进行迭代以单独打印。

您只需将所选项目获取到ListBoxItem,然后将内容分配到所需的字符串:

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

这对我很有用,希望对我有帮助。不要将字符串生成器添加到列表中,这是对对象集合的对象引用。使用
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);
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
命名空间Windows窗体应用程序3
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
StringBuilder=新的StringBuilder();
对于(int i=0;i<10;i++)
{
附录(i);
listBox1.Items.Add(生成器);
builder.Clear();
}
对于(int i=0;i<10;i++)
{
附录(i);
listBox2.Items.Add(builder.ToString());
builder.Clear();
}
}
私有无效按钮2\u单击(对象发送者,事件参数e)
{
字符串a=listBox1.GetItemText(listBox1.SelectedItem.ToString());
字符串b=listBox1.SelectedItem.ToString();
字符串c=listBox1.GetItemText(listBox1.SelectedItem);
字符串d=listBox2.GetItemText(listBox2.SelectedItem.ToString());
字符串f=listBox2.SelectedItem.ToString();
字符串g=listBox2.GetItemText(listBox2.SelectedItem);
MessageBox.Show(“1:+a+b+c+”\r\n2:+d+f+g);
}
}
}

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

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

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

for(int i=0;i
或者使用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();
}
StringBuilder ab=new StringBuilder();
对于(int i=0;i
Try
listBox1.GetItemText(listBox1.SelectedItem)仍然不工作,请查看我的线程,这不是java代码吗?我知道C#与java很相似,但它有这么相似吗?@Synoon不,这是C#,看看标签。噢,是的,thx String;)如果您单步执行代码(使用断点+F10),变量“a”“b”和“c”是否检索到值?请查看我的编辑,似乎“所选项为空”,但我确实选择了它,如果我不选择它并按start方法,我会得到一个错误(异常)你也可以看看可能有用的不同事件处理程序。看起来我的速度太慢了2秒LOL.+1
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();
}