Выбор и обновление таблицы данных в Windows Forms - PullRequest
3 голосов
/ 12 декабря 2011

XML

<?xml version="1.0" encoding="utf-8"?>
<TrackCollection>
  <Tracks>
      <Id>1</Id>
      <Artist>Artist 1</Artist>
      <Album>His album</Album>
      <Filepath>C://music//song.mp3</Filepath>
      <Id>2</Id>
      <Artist>Artist 1</Artist>
      <Album>His album</Album>
      <Filepath>C://music//song2.mp3</Filepath>
      <Id>3</Id>
      <Artist>Artist 1</Artist>
      <Album>His album</Album>
      <Filepath>C://music//song2.mp3</Filepath>

  </Tracks>
</TrackCollection>

 DataSet dsStore = new DataSet();
 DataTable dt = new DataTable();
 public void loadXmlTracks()
    {
        //TrackCollection tracks = null;
        string path = "..//..//..//test.xml";

        //XmlSerializer serializer = new XmlSerializer(typeof(TrackCollection));

        //StreamReader reader = new StreamReader(path);
        //tracks = (TrackCollection)serializer.Deserialize(reader);
        //reader.Close();
        dsStore.ReadXml(path);
        dt = dsStore.Tables["Track"];

        // finally bind the data to the grid
        LoadGrid(dt);


    }

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    int i;
    int j;

    i = e.RowIndex;
    j = e.ColumnIndex;

    string id = dataGridView1.Rows[i].Cells[0].Value.ToString();
    string value = dataGridView1.Rows[i].Cells[j].Value.ToString();

    DataRow[] row = dt.Select("Id=" + i, "Id");
    foreach (DataRow r in row)
    {
        r[j] = value;
        r.AcceptChanges();
    }

public void LoadGrid(DataTable dt)
    {
        dataGridView1.DataSource = null;
        dataGridView1.DataSource = dt;
    }

РЕДАКТИРОВАТЬ: вот мой xml-файл, который загружается, затем я беру его и вставляю в таблицу данных, а затем использую эту таблицу для загрузки моего вида таблицы данных. Я бы хотел, чтобы пользователь изменил ячейку в сетке данных, чтобы обновить эту строку в моей таблице данных, поэтому, когда я закрываю приложение, оно сохраняется в файле XML.

Что я не уверен и не могу понять, так это как сохранить это изменение обратно в Datatable и правильно ли делать цикл, если у меня есть идентификатор строки, которую нужно изменить?

Я попробовал RowFilter, и это произвело изменение, но когда я перезагружал мое представление данных, оно отображало только строку, которую я изменил ..

1 Ответ

1 голос
/ 13 декабря 2011

в вашем коде вижу заметку:

  1. когда вы вызываете «AcceptChanges», вы изменяете статус строки изменения строки от Изменено, добавлено, ... до неизменного, поэтому команда upadte «dataadaptor» не может найти запись изменений в вашем «datatable», и ваши изменения не применяются в базы данных.
  2. если вы знаете свой Id, а идентификатор является первичным ключом в вашей таблице данных, тогда вы можете использовать «dt.Rows.Find (i)», и он даст вам datarow с идентификатором, который вы хотите

но если ваша сетка данных привязана к вашей таблице данных, делать такую ​​вещь не нужно, когда вы меняете одну ячейку, эти изменения будут применяться к вашей таблице данных, единственное, что, если вы измените одну ячейку, изменение не будет применяться к вашей данные, пока вы не переместитесь из одного ряда в другой.

EDIT: Удалите функцию «dataGridView1_CellEndEdit» и добавьте обработчик события закрытия формы следующим образом:

private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
               string path = "..//..//..//test.xml";
               dataGridView1.EndEdit();
               if(dsStore.GetChanges()!=null)
               {
                   dsStore.WriteXml(path);
               }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...