Как заменить DataTable в DataSet, чтобы DataGridView отображал новое содержимое DataTable? - PullRequest
0 голосов
/ 08 марта 2012
  • Заменяемый набор данных имеет то же имя таблицы, что и исходная таблица данных.
  • Я пробовал DataSet.Tables.Clear (), а также DataSet.Tables.Remove (...)
  • Кажется, что DataTable внутри DataSet заменяется, однако DataGridView продолжает показывать старое содержимое DataTable.
  • Невозможно выполнить слияние - необходимо полностью заменить содержимое новой DataTable.
  • Я могу заменить и отразить изменения в DataGridView, если новое имя таблицы DataTable отличается от имени заменяемой таблицы DataTable.

    public partial class Form1 : Form
     {
    private DataSet _ds;
    public Form1()
    {
        InitializeComponent();
        _ds = new DataSet("DS");
        dataGridView1.DataSource = _ds;
        addTableOne();
    }
    private void addTableOne()
    {
        DataTable dtOne = new DataTable("Original");
    
        DataColumn auto = new DataColumn("AutoID", typeof(System.Int32));
        dtOne.Columns.Add(auto);
        DataColumn name = new DataColumn("Name", typeof(string));
        dtOne.Columns.Add(name);
    
        DataRow row = null;
        for (int i = 0; i < 5; i++)
        {
            row = dtOne.NewRow();
            row["AutoID"] = i + 1;
            row["Name"] = i + " - Original";
            dtOne.Rows.Add(row);
        }
    
        _ds.Tables.Add(dtOne);
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text = "DataSet count: " + _ds.Tables.Count;
        dataGridView1.DataMember = "Original";
    }
    
    
    private DataTable getAltTable()
    {
        DataTable dtOne = new DataTable("Original");
    
        DataColumn auto = new DataColumn("AutoID", typeof(System.Int32));
        dtOne.Columns.Add(auto);
        DataColumn name = new DataColumn("Name", typeof(string));
        dtOne.Columns.Add(name);
    
        DataRow row = null;
        for (int i = 0; i < 10; i++)
        {
            row = dtOne.NewRow();
            row["AutoID"] = i + 1;
            row["Name"] = i + " - Alt";
            dtOne.Rows.Add(row);
        }
    
        return dtOne;
    }
    
    private void button3_Click(object sender, EventArgs e)
    {
        DataTable temp = _ds.Tables["Original"];
        string tTable = Convert.ToString(DateTime.Now.Ticks); ;
        temp.TableName = tTable;
        _ds.Tables.Remove(tTable);
    
        // tried
        //_ds.Tables.Clear();
    
        // tried following
        //temp.Dispose();
        //temp = null;
        label1.Text = "DataSet count: " + _ds.Tables.Count;
        timer1.Enabled = true;
    
    }
    
    // here is where the old datatable contents still show in DataGridView
    private void timer1_Tick(object sender, EventArgs e)
    {
        timer1.Enabled = false;
        DataTable dt = getAltTable();
        _ds.Tables.Add(dt);
        dataGridView1.DataMember = "Original";
        label1.Text = "DataSet count: " + _ds.Tables.Count;
    }
    

    }

...