добавить новый в gridcontrol devexpress

Я пытаюсь добавить новую строку в datagridview нажатием кнопки для целей обучения. Когда я нажимаю кнопку, она удаляет старые данные и добавляет новую строку. Но я хочу добавить его в сетку

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

private void Form1_Load(object sender, EventArgs e)
    {
        SqlConnection connection = new SqlConnection("Data Source=ARIF-BILGISAYAR;Initial Catalog=RotanetLocal;Persist Security Info=True;User ID=sa;Password=12345");
        SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM TestTable", connection);
        DataSet sourceDataSet = new DataSet();
        adapter.Fill(sourceDataSet);
        gridControl1.DataSource = sourceDataSet.Tables[0];

    }

и вот мое событие кнопки, которое должно добавить строку в сетку, но оно удаляет старые данные и вставляет новые

private void btn_update_Click(object sender, EventArgs e)
    {
        DataTable dtOperation = new DataTable();

        var myOriginalDataSource = (DataTable)gridControl1.DataSource;
        var dr = myOriginalDataSource.NewRow();
        dr["id"] = 1;
        dr["name"] = "Gelen Havale";
        dr["lname"] = "Gelen Havale";
        dtOperation.Rows.Add(dr);

        gridControl1.Refresh();
    }

моя функция btn_update_click теперь пытается создать строку и добавить ее к старым данным. но теперь вылетает. Он говорит, что эта строка принадлежит другой таблице. как я могу это исправить?


person Arif YILMAZ    schedule 03.05.2013    source источник


Ответы (3)


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

Добавьте новую строку в существующий источник данных, а затем вызовите метод Refresh().

С другой стороны, если вы используете WPF, откажитесь от использования DataTable и вместо этого начните использовать ObservableCollection<T>.

    private void btn_update_Click(object sender, EventArgs e)
    {
        var myOriginalDataSource = gridControl1.DataSource;
        var dr = myOriginalDataSource.NewRow();

        dr["id"] = 1;
        dr["name"] = "Gelen Havale";
        dr["lname"] = "Gelen Havale";

        gridControl1.Refresh();
    }

Refresh() - это псевдокод, так как я не знаю, как DevExpress WinForms очень хорошо управляет.

person Jammer    schedule 03.05.2013
comment
как вы добавляете в существующий источник данных? - person Arif YILMAZ; 03.05.2013
comment
Создайте новый объект DataRow и заполните его, вызвав метод NewRow() для объекта ORIGINAL DataSource sourceDataSet. Затем вызовите метод Refresh() для экземпляра gridControl1. - person Jammer; 03.05.2013
comment
Вы смотрите на правильный объект? Это метод класса System.Data.DataTable. Вы можете либо кэшировать ссылку на исходный источник данных в частном поле на уровне класса, либо получить его из своего элемента управления, как в примере, который я предоставил gridControl1.DataSource - person Jammer; 03.05.2013
comment
Это все еще ОЧЕНЬ неправильно. Вы разрешаете myOriginalDataSource, но все еще добавляете новую строку в dtOperation. Я добавлю еще один ответ. - person Jammer; 03.05.2013
comment
Нет необходимости в gridcontrol.Refresh() или gridControl1.RefreshDataSource(), gridcontrol обнаружит изменения из большинства источников. И код глушилки будет работать.... - person Stig; 07.05.2013

Вам нужно изменить свой код на это:

private void btn_update_Click(object sender, EventArgs e)
{
    var myOriginalDataSource = (DataTable)gridControl1.DataSource;
    var dr = myOriginalDataSource.NewRow();

    dr["id"] = 1;
    dr["name"] = "Gelen Havale";
    dr["lname"] = "Gelen Havale";

    gridControl1.Refresh();
}

Я думаю, что стоит потратить некоторое время на чтение принципов объектной ориентации

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

person Jammer    schedule 03.05.2013
comment
Хорошо, есть ли в элементе управления DevExpress метод BindData() или аналогичный? Я действительно не знаком с элементами управления, которые вы используете, поэтому вам может потребоваться поддержка напрямую от DevExpress. Если вы отлаживаете этот метод, а точка останова в строке Refresh() просматривает содержимое myOriginalDataSource, щелкнув значок увеличительного стекла, откроется средство просмотра DataTable, и вы сможете подтвердить, что новая строка была добавлена. Если он был добавлен правильно, начните искать метод DataBind() в элементе управления сеткой. - person Jammer; 03.05.2013

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

person mastermind    schedule 03.05.2013