Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 13
1

LINQ при привязке List<string[]> к DataGrid.DataContext через IBindingList

01.10.2013, 12:04. Показов 2230. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую сообщество.

Что неправильно в выражении LINQ, приведенном ниже ?
Дебаггер показывает что X_loc прекрасно формируется, но qper_loc = null.
Цель экзерсисов - привязать List<string[]> к DataGrid.DataContext через IBindingList.

Заранее благодарен за помощь.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        private void TestFunc()
        {
            IBindingList qper_loc;
            List<string[]> X_loc;
            X_loc = new List<string[]>();
            for (int i = 0; i <= 10; i++)
            {
                string[] StrPairLoc = new string[2];
                StrPairLoc[0] = "A";
                StrPairLoc[1] = "B";
                X_loc.Add(StrPairLoc);
            }
 
            qper_loc = (from ss in X.AsQueryable<string[]>() select new { A = ss[0], B = ss[1] }) as IBindingList;
 
            foreach (var ss in qper)
            {
                var sss = ss;
            }
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.10.2013, 12:04
Ответы с готовыми решениями:

Linq преобразование List<List<double>> в List<Array>
Доброго времени суток, данный код нужно преобразовать linq выражениями и дописать выборку из ...

Разбить List<string> на несколько обьектов c List<string>
Задумался как я то кусочками все делить оказалось не так уж просто :scratch: List&lt;string&gt;...

Конвертировать один элемент из List<List<Class>> в list и string
Как можно перевести один выбранный элемент из List&lt;List&lt;Data&gt;&gt; myList в list и string? Например,...

Как передать list<string> в поток и как такой же list<string> вывести из потока?
Как передать list&lt;string&gt; в поток и как такой же list&lt;string&gt; вывести из потока в richtextbox?...

12
6287 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
01.10.2013, 13:04 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
List<string[]> list = new List<string[]> {
    new[] { "123", "234" },
    new[] { "456", "567" }
};
var sequense = list.Select(x => new { A = x[0], B = x[1] })
    .ToList();
Type elementType = sequense.GetType().GetGenericArguments()[0];
Type iListType = typeof(IList<>).MakeGenericType(elementType);
ConstructorInfo bindingListConstructor = typeof(BindingList<>)
    .MakeGenericType(elementType)
    .GetConstructor(new Type[] { iListType });
IBindingList dataSource = (IBindingList)bindingListConstructor
    .Invoke(new object[] { sequense });
dataGridView1.DataSource = dataSource;
1
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 13
01.10.2013, 14:57  [ТС] 3
Пётррр, спасибо большое.

Датасурс появился, он заполнен. Однако DataGrid не заполняется значениями (остается серый и пустой).
М.б. дело в том, что используется не DataGridView, как у Вас в примере, а DataGrid проекта wpf?

Проект - именно wpf, после формирования DataSource делаю следующее:

C#
1
2
            MyDataGrid.DataContext = dataSource;
            MyDataGrid.Items.Refresh();
у Вас :

C#
1
dataGridView1.DataSource = dataSource;
0
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
01.10.2013, 16:18 4
Если мУсье работает с WPF то он должен знать, что надо указывать биндинг с контексту:
C#
1
 MyDataGrid.DataContext = dataSource;
XML
1
<DataGrid Name="MyDataGrid" ItemsSource={Binding}
А вот это:
C#
1
MyDataGrid.Items.Refresh();
бррр.... если пользуетесь привязками.
1
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 13
01.10.2013, 16:45  [ТС] 5
Константин, спасибо за реплику.

В данном случае мусье не работает, а развлекается, и находит предпочтительным развлекаться именно с WPF. Что именно мусье должен прописать как ItemsSource={Binding} ? ("{ не допускается в имени" - всплывающая подсказка среды).

Из "бррр.... если пользуетесь привязками." понял, что Refresh излишен при нормально заданном DataContext. Мне тоже показалось странным делать Refresh, так видел в каком-то примере.
0
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
01.10.2013, 16:52 6
C#
1
ItemsSource="{Binding}"

Не по теме:

вот собственно и ответ на свой вопрос я получил (так негласно) вы пока что работаете с WPF как с обычными WinForms

1
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 13
02.10.2013, 11:56  [ТС] 7
константин, спасибо еще раз
всё лучше и лучше
грид побелел и в нем появились строки по числу в ДатаСорс и столбцы по числу определенных в свойствах, но значения не отображаются (всё белое) - без разницы делать рефреш или нет

на не по теме - я не могу работать с wpf как c winforms т.к. winforms я тоже не знаю )

Добавлено через 26 минут
спасибо, проставил автогенерацию столбцов
день удался )))

Добавлено через 18 часов 18 минут
всем спасибо еще раз

приведенный Петррром код с учетом замечаний Константина прекрасно работает
но есть одно но
в идеале хотелось определить такой BindingList через LINQ как член класса, чтобы можно было один раз его присвоить DataGrid.DataContext и дальше забыть об его обновлении. т.е. чтобы при каждой модификации исходного List<string[]> DataGrid обновлялась "сама".
в приведенном же Петррром примере всё происходит через присваивание
C#
1
var sequense = list.Select(x => new { A = x[0], B = x[1] }).ToList();
т.е. обновление DataGrid каждый раз нужно вызывать явно.
удовлетворить такие желания средствами C# вообще возможно ?
поверхностное чтение создало впечатление что возможно. как?
0
6287 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
02.10.2013, 12:04 8
DataGrid не будет сам обновляться, потому что для этих целей нужно унаследовать интерфейс INotifyPropertyChanged. Так как там анонимный тип, ничего не выйдет.
И вообще не понятно, зачем вы собрались делать такое убожество. Неужели сложно создать один класс с двумя свойствами.?
1
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 13
02.10.2013, 12:21  [ТС] 9
Цитата Сообщение от Петррр Посмотреть сообщение
DataGrid не будет сам обновляться, потому что для этих целей нужно унаследовать интерфейс INotifyPropertyChanged. Так как там анонимный тип, ничего не выйдет.
И вообще не понятно, зачем вы собрались делать такое убожество. Неужели сложно создать один класс с двумя свойствами.?
Петррр, почему убожество ? ))
Что за "один класс с двумя свойствами"? структура - пара стрингов ? ) если речь об этом, то это же неинтересно) или Вы что то другое имеете в виду ?

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

спасибо за ответ, посмотрю про INotifyPropertyChanged.
0
6287 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
02.10.2013, 12:23 10
Цитата Сообщение от rstm Посмотреть сообщение
структура - пара стрингов
Именно.

Добавлено через 24 секунды
Цитата Сообщение от rstm Посмотреть сообщение
то это же неинтересно)
А учиться делать не правильно интересно?
1
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 13
02.10.2013, 12:35  [ТС] 11
Цитата Сообщение от Петррр Посмотреть сообщение
А учиться делать не правильно интересно?
дело в том, Петррр, что вся эта задачка абсолютно "неправильная", т.е. прекрасно решается массой других, уже существующих средств
почему Вы пишете "не правильно" ? Вы имеете ввиду, что фиксированная структура из строк при работе с DataGrid вообще лучше чем List<string[]> ? Чем лучше ? Вроде бы List<string[]> универсальнее, но м.б. я чего то не понимаю, объясните.
0
6287 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
02.10.2013, 12:48 12
Если у вас куча источников, которые могут обновить этот список, то вам постоянно придется писать то, что написано во втором посте.
1
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 13
02.10.2013, 13:15  [ТС] 13
да, посмотрев внимательнее, увидел в чем сложность.
думаю это можно как-то решить явным созданием типов из кода
(вместо
C#
1
            var sequense = X.Select(x => new { A = x[0], B = x[1] }).ToList();
)
хотя, конечно, выходит за рамки моих нынешних скромных целей )
спасибо
0
02.10.2013, 13:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.10.2013, 13:15
Помогаю со студенческими работами здесь

List<string> запись данных через запятую и определенное количество
Как записать динамические данные с сервера в List&lt;string&gt; через запятую и по 50-100 штук? ...

Передача и принятие объекта List<string> через StreamWriter и StreamReader
Имеется 2 программы: клиент и сервер. Сообщения строковые передаются без проблем, все получается, а...

List<string, string, string> есть ли в C# что-то подобное?
Мне надо добавить в List не только имя файла, но и некоторые строки из этого файла. Т.е. например,...

Ошибка приведения типа при дешифровке List<string>
Хелпуйте кто может =) private void Serialize() { string t1 = String.Empty;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru