繁体   English   中英

使用C#使用XmlReader正确读取XML文件

[英]Read XML-File correctly using XmlReader using C#

我正在写一个简短的程序,向我显示我所有的待办事项。 我有2个标签。 1选项卡用于创建新的待办事项,另一个选项卡用于向我显示我选择的每个待办事项的详细信息。 因此,我必须将创建的待办事项保存在xml文件中。 为此,我正在使用DataTable和DataSet,并且工作正常。 这是我的代码:

private void btn_Save_Click(object sender, EventArgs e)
        {
            DataSet dataset = new DataSet();

            if (File.Exists(@"C:\Users\rs\Desktop\Test\save.xml"))
            {
                dataset.ReadXml(@"C:\Users\rs\Desktop\Test\save.xml");

                dataset.Tables[0].Rows.Add(txt_Name.Text, combox_Priority.Text, txt_Beginn.Text, txt_EndSoll.Text, txt_EndIst.Text, txt_Bemerkungen.Text);
                dataset.WriteXml(@"C:\Users\rs\Desktop\Test\save.xml");
            }

            else
            {
                DataTable datatable = new DataTable();
                datatable.TableName = "SaveInput";

                DataColumn dc1 = new DataColumn("Name");
                DataColumn dc2 = new DataColumn("Priority");
                DataColumn dc3 = new DataColumn("StartDate");
                DataColumn dc4 = new DataColumn("EndDateSoll");
                DataColumn dc5 = new DataColumn("EndDateIst");
                DataColumn dc6 = new DataColumn("Comment");

                datatable.Columns.Add(dc1);
                datatable.Columns.Add(dc2);
                datatable.Columns.Add(dc3);
                datatable.Columns.Add(dc4);
                datatable.Columns.Add(dc5);
                datatable.Columns.Add(dc6);

                datatable.Rows.Add(txt_Name.Text, combox_Priority.Text, txt_Beginn.Text, txt_EndSoll.Text, txt_EndIst.Text, txt_Bemerkungen.Text);

                DataSet dataset2 = new DataSet();

                dataset2.Tables.Add(datatable);
                dataset2.DataSetName = "iToDo";

                dataset2.WriteXml(@"C:\Users\rs\Desktop\Test\save.xml");
            }

            XmlTextReader xmlreader = new XmlTextReader(@"C:\Users\rs\Desktop\Test\save.xml");
            XmlNodeType nodetype;

            while (xmlreader.Read())
            {
                nodetype = xmlreader.NodeType;

                if (nodetype == XmlNodeType.Element)
                {
                    if (xmlreader.Name == "Name")
                    {
                        xmlreader.Read();
                        combox_Name2.Items.Add(xmlreader.Value);
                    }

                    else if (xmlreader.Name == "Priority")
                    {
                        xmlreader.Read();
                    }

                    else if (xmlreader.Name == "StartDate")
                    {
                        xmlreader.Read();
                    }

                    else if (xmlreader.Name == "EndDateSoll")
                    {
                        xmlreader.Read();
                    }

                    else if (xmlreader.Name == "EndDateIst")
                    {
                        xmlreader.Read();
                    }

                    else if (xmlreader.Name == "Comment")
                    {
                        xmlreader.Read();
                    }
                }
            }

            xmlreader.Close();
        }

现在的问题是:我希望每次选择创建的“待办事项”时,它都可以向我显示正确的详细信息。 所以我正在使用SelectedIndexChanged 我也用过

if (combox_Name2.SelectedIndex > -1)
            {

            }

但是我认为我没有正确编码,因为没有显示细节。 有人可以给我提示吗? 我整个下午都在编辑代码,但是对于初学者来说,如果您不知道在哪里出错,确实很难。 :)

干杯

我建议您看看xml serializer 数据表很难使用,因此您可以创建一个“待办事项”类,并在组合框中单击相应的标识符(可以说名称)后显示该类的属性。

序列化可能不是这里的问题,它很可能与您尝试在组合框中显示的内容以及如何将其链接到数据集的行有关。

编辑:我有两个可能的解决方案。 它们既麻烦又丑陋,但最好的方法是在实现的范围内。 第一:

使您的数据集可被您班上的所有方法访问:

public partial class Form1 : Form {
    private DataSet dataset;
    private DataTable datatable;

    public Form1()
    {

然后,您可以(在对其进行初始化之后,并确保其中有一个表,对该类进行所有小的调整)在组合框Eventhandler中执行以下操作:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (comboBox1.SelectedIndex > -1)
        {
            DataTable tempTable = dataset.Tables[0];
            foreach (DataRow row in tempTable.Rows)
            {
                if (row[0].ToString() == comboBox1.SelectedItem.ToString())
                {
                    label1.Text = row[1].ToString();
                    label2.Text = row[2].ToString();
                    label3.Text = row[3].ToString();
                    label4.Text = row[4].ToString();
                    label5.Text = row[5].ToString();
                    label6.Text = row[6].ToString();
                }
            }

        }
}

我用文本填充了标签,但是我非常确定您也可以弄清楚如何填充其他控件;)第二种解决方案甚至更麻烦,但是不需要对现有代码进行任何调整:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (comboBox1.SelectedIndex > -1) {
            XmlTextReader xmlreader = new XmlTextReader(@"C:\save.xml");
            XmlNodeType nodetype;
            bool xmlReaderArmed = false;
            while (xmlreader.Read())
            {
                nodetype = xmlreader.NodeType;

                if (nodetype == XmlNodeType.Element)
                {
                    if (xmlreader.Name == "Name")
                    {
                        xmlreader.Read();
                        if (xmlreader.Value == comboBox1.SelectedItem.ToString()) {
                            label1.Text = xmlreader.Value;
                            xmlReaderArmed = true; 
                        }
                    }
                    else if (xmlreader.Name == "Priority" && xmlReaderArmed)
                    {
                        xmlreader.Read();
                        label2.Text = xmlreader.Value;

                    }

                    else if (xmlreader.Name == "StartDate" && xmlReaderArmed)
                    {
                        xmlreader.Read();
                        label3.Text = xmlreader.Value;
                    }

                    else if (xmlreader.Name == "EndDateSoll" && xmlReaderArmed)
                    {
                        xmlreader.Read();
                        label4.Text = xmlreader.Value;
                    }

                    else if (xmlreader.Name == "EndDateIst" && xmlReaderArmed)
                    {
                        xmlreader.Read();
                        label5.Text = xmlreader.Value;
                    }

                    else if (xmlreader.Name == "Comment" && xmlReaderArmed)
                    {
                        xmlreader.Read();
                        label6.Text = xmlreader.Value;
                        xmlReaderArmed = false;
                    }



                }
            }

            xmlreader.Close();
        }

我仍然强烈建议您重新设计解决方案。 整个过程非常不稳定,并且很难维护。 阅读有关面向对象编程的一些教程,并了解其他一些与您的解决方案类似的解决方案,例如通讯录的实现:)祝您工作顺利!

不确定您要问的是什么,所以我猜是这样:

// Associate the event-handling method with the SelectedIndexChanged event. 
combox_Name2.SelectedIndexChanged += new System.EventHandler(Combox_Name2_SelectedIndexChanged);

// The event-handling method
private void Combox_Name2_SelectedIndexChanged(object sender, System.EventArgs e)
{
    // Do your work here
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM