Как получить DataRowView, когда DataSource является универсальной коллекцией List <T>? - PullRequest
0 голосов
/ 07 октября 2019

DataGridView привязан к списку.

 public class Foo
    {
        public int A { get; set; }
        public string B { get; set; }
        public int C { get; set; }
    }

Событие загрузки формы:

        ds = new List<Foo>();
        for (int i = 0; i < 1000; i++)
        {
            ds.Add(new Foo { A = i });
        }
        bs = new BindingSource { DataSource = new BindingList<Foo>(ds) };
        dataGridView1.DataSource = bs;

Следующий код получил ошибку времени выполнения при приведении (DataRowView). Тип Foo

        var foo = (DataRowView) dataGridView1.Rows[990].DataBoundItem;
        foo["B"] = "....";
        foo.EndEdit();

Ответы [ 2 ]

0 голосов
/ 11 октября 2019
           //hope it helps
            DataRowView dataRow = (DataRowView)tbl_perDataGrid.SelectedItem;
            //if multiple selection
            DataRowView row = (DataRowView)t_datagrid.SelectedItems[0];
            string s = row["name"].ToString();
            ----------------------------------------more useful code for working with DataRowView   
            ///getting column
                int i = (int)((DataRowView)t_datagrid.SelectedItems[0])["id"];

            ///with indexes
                //-------------------------------------
                DataGridRow row1 = e.Row;

                int row_index = ((DataGrid)sender).ItemContainerGenerator.IndexFromContainer(row1);
                int numberOfColumns = ((DataGrid)sender).Columns.Count;

                //-----------------------------------
0 голосов
/ 07 октября 2019

DataBoundItem - это тип Foo ... Нет доступного DataRowView, поскольку нет DataTable, поскольку источником является список ...

Вы можете написать:

var foo = (Foo)dataGridView1.Rows[990].DataBoundItem;
foo.B = "....";
((BindingSource)dataGridView1.DataSource).ResetBindings(false);

Кажется, что работает так:

Чтобы обновить представление модифицированного DataBoundItem, который является объектом DataSource, который представляет собой BindingList или просто List, мы можем переназначить DataSource.

Но если это BindingSource, вы можете использовать ResetBindings на BindingSurce.

Но если вы используете DataTable вместо DataSource наЗатем вы можете использовать EndEdit для DataBoundItem, который является DataRowView.

Тогда возникает вопрос: что лучше делать здесь: использовать BindingSource в List или создать DataTable иуправлять LoadFromStream и SaveFromStream, поскольку вы сказали, что данные поступают из потока IEnumerable <>?

Поэтому вы можете увидеть CopyToDataTable () для сопоставления вашего Списка с DataTable:

Создание таблицы данных из запроса (LINQ to DataSet)

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