C# 无法通过类使用listbox选定项更改标签

C# 无法通过类使用listbox选定项更改标签,c#,xml,winforms,listbox,C#,Xml,Winforms,Listbox,我有一个列表框,其中包含来自和xml文件的标记的名称,还有其他标记也包含在类中,但当我尝试单击列表框中的值以将标签文本设置为类中的值时,我得到以下错误:“InvalidCastException未得到处理。无法将“System.String”类型的对象强制转换为“Coursework1.modules”类型。“ 这是代码,它位于索引更改时的listbox事件中 for (int i = 0; i < selectionBox.Items.Count; i++) {

我有一个列表框,其中包含来自和xml文件的标记的名称,还有其他标记也包含在类中,但当我尝试单击列表框中的值以将标签文本设置为类中的值时,我得到以下错误:“InvalidCastException未得到处理。无法将“System.String”类型的对象强制转换为“Coursework1.modules”类型。“ 这是代码,它位于索引更改时的listbox事件中

for (int i = 0; i < selectionBox.Items.Count; i++)
        {
            if (selectionBox.GetSelected(i) == true)
            {
                infoLabel.Text = ((modules)selectionBox.Items[i]).mInfo;
                lectureSlotLabel.Text = ((modules)selectionBox.Items[i]).mLSlot;
                tutorialLabel.Text = ((modules)selectionBox.Items[i]).mTSlot;
                prerequisiteLabel.Text = ((modules)selectionBox.Items[i]).mPreReq;
                codeLabel.Text = ((modules)selectionBox.Items[i]).mCode;
                nameLabel.Text =((modules)selectionBox.Items[i]).mName;
            }
        }
//正在使用的标签文本

var xmlFile = XDocument.Load(xmlDirectory + @"\XML.xml");
        //Finds the XML file again and looks for the Name tag
        var mName = from directory in xmlFile.Descendants("Name")
                    where directory.Value == (String)selectionBox.SelectedItem
                    select directory.Parent.Element("Name").Value;
        //in the mName we search the directory for the Name tag and after we search
        //for the selected item of the list in the directory after that we look for 
        //the "Name" element in the directory and that gets the name value and saves it to
        //mName
        foreach (var item in mName)
        {
            //use the loop to make it dynamic as when the selected item changes so does,
            //the moduleName label
            nameLabel.Text = item.ToString();
        }

这不是问题本身的答案,而是OP在评论中发布的问题的答案:


@HighCore你能告诉我你说的第一次选角是什么意思吗 事情

你不应该这样做

((模块))选择框。项目[i]

很多次,取而代之的是

if (selectionBox.GetSelected(i) == true)
{
    var module = selectionBox.Items[i] as modules; 

    if (module != null)
    {
        infoLabel.Text = module.mInfo;
        //etc...
    }
}
这更简单,也更安全(因为我实际上是在检查它是否是一个
模块。这可以防止抛出异常。

这一行:

selectionBox.Items.Add(m.mName);
只是将
模块的名称
加载到
选择框
,这可以解释为什么您在尝试将
字符串
强制转换到
模块
时遇到问题。您需要研究的是使用数据绑定。将此代码添加到
foreach(模块中的对象o)
循环中:

selectionBox.DataSource = module;
selectionBox.DisplayMember = "mName";
在“索引已更改”事件中,您可以如下方式检索所选项目:

modules m = (modules)selectionBox.SelectedItem;
此外,如果确实以这种方式检索所选项目,则可以取消当前在index changed事件处理程序中的
for
循环

编辑:

当前,您正在将每个
模块的名称添加到
选择框中
。但是,当您要检索所选项目时,在尝试将对象的名称强制转换为实际对象时,会出现错误

因此,使用我的解决方案:

selectionBox.DataSource = module;
将您创建的对象列表指定为
选择框
数据源
(即从中获取数据),以及

selectionBox.DisplayMember = "mName";

指示应将对象的哪个属性用作显示文本。在这种情况下,我有
mName
,因为这是您之前添加到
selectionBox

的属性,将相同的对象强制转换为相同的类型10次。EPIC。此外,完全缺乏C#命名约定。类型名称必须
大小写正确(即
模块
而不是
模块
)。为什么您的属性/字段有一个
m
前缀??它们有模块的“m”前缀,我已经将类名改为模块,抱歉。@HighCore您能告诉我第一个强制转换的意思吗?您能显示填充
选择框的代码吗?我已经试过了您所说的,是吗是时候我没有得到一个错误,但我的目标是做的事情,即根据突出显示的列表项更改标签不起作用。我知道我在第一个代码中所做的工作与在另一个程序中的工作是一样的,这是相同的过程。我不确定我是否理解你的意思?如果有帮助,我在fo中有一个提交按钮rm,它创建一个XML并保存我选择的值,并将其移动到另一个列表中并正确显示。@User215719您不了解哪一位?我刚刚添加了您建议的代码,但出现了一个错误,错误是“Coursework1.Form1.module是一个字段,但用作类型我不明白发生了什么,所以在“selectionBox.DataSource=module;selectionBox.DisplayMember=“mName;”我是否将mName添加到列表框中?我无法选中此项,因为我遇到了一个错误。@user2157179查看我的编辑。另外,您从哪里得到错误消息?我已经尝试了您单独说过的几件事,首先,如果我用上述代码填充selectionList,每当我使用与selectionBox有关的按钮时,我都会遇到一个错误我得到了一个错误,但它们只显示我运行了代码。如果我同时添加这两个部分,就会得到上面提到的错误。
selectionBox.DisplayMember = "mName";