Member 13375990 Ответов: 1

Как удалить повторяющиеся или не отображать повторяющиеся значения в XML-документе


привет, проблема в том, что я создал приложение winform, которое может добавлять данные из datatable в xml-документ, а также обновлять, удалять. но я использую readxml () и writexml() для чтения данных из xml и записи данных в xml, но один раз, если я добавил одну строку в xml-документ, то если я снова хотел добавить одну строку, то строка добавляется с данными, а также предыдущими данными, как повторение всего datatable, и когда я открыл приложение, если я удалил одну строку, xml-документ становится ошибкой, и исключения приходят, пожалуйста, помогите мне

Что я уже пробовал:

private void Form1_Load(object sender, EventArgs e)
{
    dtable.Columns.Add("NAME");
    dtable.Columns.Add("DESIGNATION");
    dtable.Columns.Add("COMPANY");
    dgvxml.DataSource = dtable;
    ds.ReadXml(str);
    ds.WriteXml(str);
    dgvxml.DataSource = ds.Tables[0];
}

private void btnadd_Click(object sender, EventArgs e)
{
    dtable.TableName = "PARTICIPANTS";

    if (a <= 0)
    {
        dtable.ReadXml(str);
        a++;
    }

    DataRow drow = dtable.NewRow();
    drow["NAME"] = txtname.Text;
    drow["DESIGNATION"] = txtdesig.Text;
    drow["COMPANY"] = txtcomp.Text;
    dtable.Rows.Add(drow);
    dgvxml.DataSource = dtable;
    dtable.WriteXml(str);

    txtname.Text = "";
    txtdesig.Text = "";
    txtcomp.Text = "";
    label4.Text = "";
    timer1.Start();
}

private void btndel_Click(object sender, EventArgs e)
{
    try
    {
        if (txtname.Text == "" || txtcomp.Text == "" || txtcomp.Text == "")
        {
            label4.Text = "Select one row";
        }
        else
        {
            int rowindex = dgvxml.CurrentCell.RowIndex;
            dgvxml.Rows.RemoveAt(rowindex);

            dtable.WriteXml(str);

            txtname.Text = "";
            txtdesig.Text = "";
            txtcomp.Text = "";
            label4.Text = "";
            btnadd.Visible = true;
        }
    }
    catch (Exception)
    {

        label4.Text = "Change the Xml file name and proceed";
    }
}

Sheila Pontes

ПРИВЕТ,
Что означает содержимое переменной str? В чем же ошибка?

Thomas Nielsen - getCore

Трудно сказать, с чего именно начать, было бы неплохо ввести понятие идентификатора или идентификатора, таким образом, два участника с одним и тем же именем одновременно возможны и идентифицируемы.

В вашей настройке вы хотите сохранить данные в ado. dataset и datatable и сохранить их в xml-документе. Но теперь вы действительно хотите отображать имена, если есть дубликаты, и логически не хранить их, я уверен.

Но тогда почему бы не использовать список и класс данных, а также linq и, скажем, Json, поскольку он менее раздут по сравнению с xml. Так что да, я бы рекомендовал перейти на более новые методы. это даст вам такие вещи, как distinct, бесплатно.

Не могли бы вы рассмотреть совершенно другую реализацию для решения вашей проблемы?

1 Ответов

Рейтинг:
0

Sheila Pontes

Привет,


Ниже приведен полный пример, чтобы помочь вашей проблеме. В этом примере я использовал одну колонку.

using System.IO;
using System.Xml;

......

DataSet ds = new System.Data.DataSet();
string str = @"C:\your_path\PARTICIPANTS.xml";

private void btn_delete_Click(object sender, EventArgs e)
{
    ds.Tables["PARTICIPANTS"].Rows[this.dgvxml.CurrentCell.RowIndex].Delete();
    ds.Tables["PARTICIPANTS"].AcceptChanges();
    this.Write_Xml();
}

private void Open_Xml()
{
     //create struct and add table in the dataset
     DataTable dtable = new System.Data.DataTable("PARTICIPANTS");
     dtable.Columns.Add("NAME");
     ds.Merge(dtable);

     //verify if the xml file exist
     if (File.Exists(str))
     {
                //open xml into dataset
                using (Stream stream_xml = new FileStream(str, FileMode.Open, FileAccess.Read))
                {
                    ds.Tables["PARTICIPANTS"].ReadXml(stream_xml);
                }
     }
     else
     { 
                //write new xml document in machine 
                this.Write_Xml();
     }
     dgvxml.DataSource = ds.Tables["PARTICIPANTS"];
}

private void Write_Xml()
{
     XmlTextWriter stwxml = new XmlTextWriter(str, System.Text.Encoding.UTF8);
     ds.Tables["PARTICIPANTS"].WriteXml(stwxml, XmlWriteMode.IgnoreSchema, false);
     stwxml.Close();  
}

private void Form3_Load(object sender, EventArgs e)
{
     //open xml
      this.Open_Xml();            
}

private void btn_add_Click(object sender, EventArgs e)
{
     //add line
      DataRow drow = ds.Tables["PARTICIPANTS"].NewRow();
      drow["NAME"] = txt_name.Text;
      ds.Tables["PARTICIPANTS"].Rows.Add(drow);
      dgvxml.DataSource = ds.Tables["PARTICIPANTS"];

      //write xml
      this.Write_Xml();
}

private void dgvxml_CellClick(object sender, DataGridViewCellEventArgs e)
{
     this.txt_name.Text = ds.Tables["PARTICIPANTS"].Rows[e.RowIndex]["NAME"].ToString();
}


Member 13375990

tq @sheila pontes моя проблема решена

Sheila Pontes

Я рад вам помочь.