1

我正在编写一个简短的程序来显示我所有的待办事项。我有 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)
            {

            }

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

干杯

4

2 回答 2

0

不知道你在问什么,所以我猜这个:

// 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
}
于 2013-09-05T03:36:58.570 回答
0

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

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

编辑:我有两种可能的解决方案。它们既有缺陷又丑陋,但在您的实施范围内,这是最好的。第一:

使您的数据集可被您类中的所有方法访问:

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

    public Form1()
    {

然后,您可以(在初始化它并确保其中有一个表格,对您的类进行所有小的调整之后)在您的组合框事件处理程序中执行以下操作:

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();
        }

我仍然强烈建议您修改您的解决方案。整个事情非常不稳定,而且很难维护。阅读一些有关面向对象编程的教程,并查看与您类似的其他人的解决方案,例如地址簿实现:) 祝您工作顺利!

于 2013-09-04T15:34:26.003 回答