【问题标题】:Getting XML data into combobox将 XML 数据放入组合框
【发布时间】:2012-07-03 13:08:32
【问题描述】:

我有一个带有 3 个组合框和一个 XML 文件的窗体,如下所示

<?xml version="1.0"?>
<shrtcutkeys>
    <Keysmain>
        <keychars>
            <key1>
                Ctrl
            </key1>
            <key1>
                Alt
            </key1>
            <key1>
                Shift
            </key1>
        </keychars>
    </Keysmain>
    <Seckeys>
        <keychars>
            <key2>
                Ctrl
            </key2>
            <key2>
                Alt
            </key2>
            <key2>
                Shift
            </key2>
        </keychars>
    </Seckeys>
    <Alphas>
        <keychars>
            <key3>
                a
            </key3>
            <key3>
                b
            </key3>
            <key3>
                c
            </key3>
        </keychars>
    </Alphas>
</shrtcutkeys>

所以我想在combobox1中显示所有key1,在combox2中显示所有key2等等..尝试这样做但没有真正工作

DataSet dsSet = new DataSet();
            dsSet.ReadXml("C:\\Users\\jackandjill\\Documents\\Visual Studio 2010\\Projects\\highlite\\highlite\\keys.xml");
            comboBox1.DataSource = dsSet.Tables["keys"];
            comboBox1.DisplayMember = "key1";  

【问题讨论】:

    标签: c# xml combobox


    【解决方案1】:

    我更喜欢使用 Linq2XML:

    将数据加载到XDocument:
    从文件中加载:

    var xmlDocument = XDocument.Load(fileName);
    

    或从字符串加载

    var xmlDocument = XDocument.Parse( @"<?xml version=""1.0""?>
    <shrtcutkeys>
        <Keysmain>
            <keychars>
                <key1>
                    Ctrl
                </key1>
                <key1>
                    Alt
                </key1>
                <key1>
                    Shift
                </key1>
            </keychars>
        </Keysmain>
        <Seckeys>
            <keychars>
                <key2>
                    Ctrl
                </key2>
                <key2>
                    Alt
                </key2>
                <key2>
                    Shift
                </key2>
            </keychars>
        </Seckeys>
        <Alphas>
            <keychars>
                <key3>
                    a
                </key3>
                <key3>
                    b
                </key3>
                <key3>
                    c
                </key3>
            </keychars>
        </Alphas>
    </shrtcutkeys>");
    

    然后你可以选择想要的项目

    var mainItems = from key in xmlDocument.Descendants("key1")
                    select key.Value;
    var secKeyItems = from key in xmlDocument.Descendants("key2")
                    select key.Value;
    var alphaItems = from key in xmlDocument.Descendants("key3")
                    select key.Value;
    

    您现在可以将每个组合绑定到选定的结果,如下所示:

    comboBox1.DataSource = mainItems.ToList();
    

    您可能想要清洗您的 XML(以删除换行符和空格)

    var mainItems = from key in xmlDocument.Descendants("key1")
                    select key.Value.Trim();
    var secKeyItems = from key in xmlDocument.Descendants("key2")
                    select key.Value.Trim();
    var alphaItems = from key in xmlDocument.Descendants("key3")
                    select key.Value.Trim();
    

    【讨论】:

    • 这是一个很好的答案,但我不明白的一件事是为什么当我这样做时 var xmlDocument = XDocument.Parse(@"C:\\Users\\jackandjill\\Documents \\Visual Studio 2010\\Projects\\highlite\\highlite\\keys.xml");我收到一条错误消息,提示“根级别的数据无效。第 1 行,位置 1。”
    • 要从文件加载,请改用XDocument.Load。此外,不要同时使用@ 和双反斜杠(\`). @` 关闭所有转义。
    【解决方案2】:

    使用 LINQ To XML:

    var xml = XElement.Parse(
                    @"<shrtcutkeys>
                            <Keysmain>
                                <keychars>
                                    <key1>
                                        Ctrl
                                    </key1>
                                    <key1>
                                        Alt
                                    </key1>
                                    <key1>
                                        Shift
                                    </key1>
                                </keychars>
                            </Keysmain>
                            <Seckeys>
                                <keychars>
                                    <key2>
                                        Ctrl
                                    </key2>
                                    <key2>
                                        Alt
                                    </key2>
                                    <key2>
                                        Shift
                                    </key2>
                                </keychars>
                            </Seckeys>
                            <Alphas>
                                <keychars>
                                    <key3>
                                        a
                                    </key3>
                                    <key3>
                                        b
                                    </key3>
                                    <key3>
                                        c
                                    </key3>
                                </keychars>
                            </Alphas>
                        </shrtcutkeys>");
    
    var key1 = xml.Descendants("key1");
    
    foreach (var key in key1)
        comboBox1.Items.Add(key.Value.Trim());
    
    var key2 = xml.Descendants("key2");
    
    foreach (var key in key2)
        comboBox2.Items.Add(key.Value.Trim());
    
    //Do the same for other keys...
    

    【讨论】:

    • 感谢您向我展示了学习 LINQ 的另一个理由!但我不明白的一件事是为什么当我这样做时 var xmlDocument = XDocument.Parse(@"C:\\Users\\jackandjill\\Documents\\Visual Studio 2010\\Projects\\highlite\\highlite\ \keys.xml");我收到一条错误消息,提示“根级别的数据无效。第 1 行,位置 1。”
    • @JackyBoi - 你的 xml 没有问题,但 XDocument.Parse 用于从字符串加载 xml,而不是文件名,因此请尝试使用 XDocument.Load
    • 哈哈,在我上班的路上很有趣,这也让我印象深刻,我试过了,效果很好..tks这么多!
    猜你喜欢
    • 2021-05-01
    • 2013-07-21
    • 2014-01-30
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 2013-07-06
    相关资源
    最近更新 更多