Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文本框中选定的组合框项,picturebox XML(XDocument)_C#_Xml_Linq - Fatal编程技术网

C# 文本框中选定的组合框项,picturebox XML(XDocument)

C# 文本框中选定的组合框项,picturebox XML(XDocument),c#,xml,linq,C#,Xml,Linq,如何将组合框中所选项目的所有值显示在文本框picturebox。。。我的XML文件如下所示: <?xml version="1.0" encoding="utf-8" standalone="yes"?> <Animals> <Anim id="26"> <Name>Master Yi</Name> <Image>D:\Hobbies\images\MasterYi.png</Image>

如何将组合框中所选项目的所有值显示在文本框picturebox。。。我的XML文件如下所示:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Animals>
  <Anim id="26">
    <Name>Master Yi</Name>
    <Image>D:\Hobbies\images\MasterYi.png</Image>
    <Description>Description Here</Description>
    <item1>ImageLocation</item1>
  </Anim>
</Animals>
我无法将输出代码与所选项目关联。我知道我需要在Parse命令中输入id。但这是如何实现的,我不明白。我需要它在我的主窗体(仅视图)和编辑窗体(用于编辑所选元素和保存)上 xmlDocument与我希望在XDocument中使用的代码相同

labelName.Text = xmlDoc.DocumentElement.ChildNodes[comboBox1.SelectedIndex].ChildNodes[0].InnerText;
                pictureBoxImg.ImageLocation = xmlDoc.DocumentElement.ChildNodes[comboBox1.SelectedIndex].ChildNodes[1].InnerText;
                textBoxDescription.Text = xmlDoc.DocumentElement.ChildNodes[comboBox1.SelectedIndex].ChildNodes[2].InnerText;
                pictureBoxItem1.ImageLocation = xmlDoc.DocumentElement.ChildNodes[comboBox1.SelectedIndex].ChildNodes[3].InnerText;
希望这有帮助

您需要添加using System.Xml.Linq;名称空间

public partial class Form1 : Form
{
    private XDocument _xmlDoc;
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        _xmlDoc = XDocument.Load(Path.Combine(Environment.CurrentDirectory, "animals.xml"));
        FillComboBox();
        comboBox1.SelectedIndexChanged += ComboBox1OnSelectedIndexChanged;
    }

    private void ComboBox1OnSelectedIndexChanged(object sender, EventArgs eventArgs)
    {
        var cmb = (ComboBox)sender;
        var selectedIndex = cmb.SelectedIndex;
        var selectedValue = cmb.SelectedValue;

        if (_xmlDoc.Root == null) return;
        var animal = (from el in _xmlDoc.Root.Elements("Anim")
                      where (string)el.Attribute("id") == selectedValue.ToString()
                      select el);

        var imagePath = animal.Select(x => x.Element("Image").Value).FirstOrDefault();
        pictureBox1.ImageLocation = @imagePath;
        txtName.Text = cmb.GetItemText(this.comboBox1.SelectedItem);
        var description = animal.Select(x => x.Element("Description").Value).FirstOrDefault();
        txtDescription.Text = description;
        var itemOne = animal.Select(x => x.Element("item1").Value).FirstOrDefault();
        txtItem.Text = itemOne;
    }

    void FillComboBox()
    {
        comboBox1.Items.Clear();

        comboBox1.DataSource = _xmlDoc.Root.Elements()
            .Select(e => new { Id = e.Attribute("id").Value, Name = e.Element("Name").Value })
            .ToList();
        comboBox1.ValueMember = "Id";
        comboBox1.DisplayMember = "Name";
    }

}

你的问题不清楚。你能解释一下你想要完成的行为吗?好的,我会尽量简单。我用ID属性填充组合框,并输出XML文件中每个元素的名称(有几个)。如果我在组合框中选择一个元素,固有字段(名称、图像、描述)将显示在相应的文本字段中。你可以说这是一个在线商店。表单上有相同的字段,这些字段按照XML文件填写。代码填充组合框在这里。我可以用xmlDocument来显示我的决心,如果你愿意的话。例如,我在xmlDocument中添加了我在XDocumentSaga中想要的相同代码是的,太棒了!只是我不能理解。。。在我将“加载”添加到FillComboBox之前,这仍然不起作用。这对您来说是正常的工作,或者我在某个地方犯了错误?加载的XML文档应该可以访问以进行进一步的处理/筛选。您使用的变量var doc仅是FillComboBox方法的本地变量,不能在该方法之外使用。像我一样在外部声明和加载。如果您看到我没有在FillComboBox方法中加载XML。我刚刚访问了它,因为我已经在表单加载中加载了xml。哦,对不起。这是我的错误,我只是没有从InitializeComponent部分删除FillComboBox方法。我还有一个问题。添加后如何刷新项目列表?我有Add form和这个Add new item在XML中。在关闭Add之后,如何在主窗体中刷新XML?
public partial class Form1 : Form
{
    private XDocument _xmlDoc;
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        _xmlDoc = XDocument.Load(Path.Combine(Environment.CurrentDirectory, "animals.xml"));
        FillComboBox();
        comboBox1.SelectedIndexChanged += ComboBox1OnSelectedIndexChanged;
    }

    private void ComboBox1OnSelectedIndexChanged(object sender, EventArgs eventArgs)
    {
        var cmb = (ComboBox)sender;
        var selectedIndex = cmb.SelectedIndex;
        var selectedValue = cmb.SelectedValue;

        if (_xmlDoc.Root == null) return;
        var animal = (from el in _xmlDoc.Root.Elements("Anim")
                      where (string)el.Attribute("id") == selectedValue.ToString()
                      select el);

        var imagePath = animal.Select(x => x.Element("Image").Value).FirstOrDefault();
        pictureBox1.ImageLocation = @imagePath;
        txtName.Text = cmb.GetItemText(this.comboBox1.SelectedItem);
        var description = animal.Select(x => x.Element("Description").Value).FirstOrDefault();
        txtDescription.Text = description;
        var itemOne = animal.Select(x => x.Element("item1").Value).FirstOrDefault();
        txtItem.Text = itemOne;
    }

    void FillComboBox()
    {
        comboBox1.Items.Clear();

        comboBox1.DataSource = _xmlDoc.Root.Elements()
            .Select(e => new { Id = e.Attribute("id").Value, Name = e.Element("Name").Value })
            .ToList();
        comboBox1.ValueMember = "Id";
        comboBox1.DisplayMember = "Name";
    }

}