Silverlight / Проблемы с данными - PullRequest
1 голос
/ 12 июня 2009

Я немного озадачен этим. У кого-нибудь есть идеи? Я постараюсь выложить пример как можно более кратким.

Создание приложения Silverlight 3.0 для базы данных SQL 2005. Использование RIA Services и Entity Framework для доступа к данным.

Мне нужно уметь заполнять сетку на столе. Тем не менее, мой пользовательский интерфейс сетки и структура моей таблицы отличаются. В основном моя сетка должна превращать строки в столбцы (например, в таблицу PIVOT). Вот мои проблемы / предположения

  1. До времени выполнения я понятия не имею, какие столбцы у меня будут в сетке.
  2. Silverlight 3 поддерживает только привязку к свойствам
  3. Silverlight 3 не позволяет добавлять строки в сетку и заполнять данные вручную.
  4. Как все мы знаем, Silverlight не имеет пространства имен System.Data (в основном DataTable)

Итак, как мне создать объект с динамическими свойствами, чтобы я мог связываться с сеткой. Каждая моя идея (многомерные массивы, хеш-таблицы и т. Д.) Разваливается, b / c SL требуется свойство для привязки, я не могу вручную добавить / заполнить строку данных и не могу понять способ добавить динамические свойства. Я видел статью о решении, включающем связанный список, но я ищу лучшую альтернативу. Это может сводиться к созданию специальной "Cody Grid", которая будет представлять собой набор текстовых полей / ярлыков. Можно сделать наверняка, но я потеряю некоторые функции сетки, которые ожидают пользователи

ЕДИНСТВЕННОЕ решение, которое мне удалось найти, - это создать запрос к таблице PIVOT в SQL 2005 и использовать объект на основе этого запроса / представления. SQL 2008 поможет мне в этом. Я бы предпочел сделать это в Silverlight, но если это последнее средство, пусть будет так. Если я пойду по маршруту PIVOT, как мне реализовать изменяющуюся структуру данных в Entity Framework?

Образец данных.

Таблица

Имя Дата Значение
Коди 1/1/09 15
Коди 1/2/09 18
Майк 1/1/09 20
Майк 1/8/09 77

Grid UI должен выглядеть как

Name       1/1/09       1/2/09     1/3/09 ....   1/8/09
Cody           15         18        NULL          NULL
Mike           20        NULL       NULL           77

Коди

Ответы [ 3 ]

1 голос
/ 19 июня 2009

Моя команда придумала хорошее решение. Я не уверен, кто заслуживает кредит, но это где-то в Google земли. Пока это работает довольно хорошо.

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

Вот часть кода, который строит объект, используя Reflection

AppDomain myDomain = AppDomain.CurrentDomain;
            AssemblyName myAsmName = new AssemblyName("MyAssembly");

            AssemblyBuilder myAssembly = myDomain.DefineDynamicAssembly(myAsmName, AssemblyBuilderAccess.Run);
            ModuleBuilder myModule = myAssembly.DefineDynamicModule(myAsmName.Name);

            TypeBuilder myType = myModule.DefineType("DataSource", TypeAttributes.Public);

            string columnName = "whatever";

            for (int j = 0; j <= array.GetUpperBound(1); j++)
            {

                Type properyType = typeof(T);
                FieldBuilder exField = myType.DefineField("_" + "columnName" + counter, properyType, FieldAttributes.Private);

                  //The following line is where I’m passing columnName + counter and getting errors with some strings but not others.
                PropertyBuilder exProperty = myType.DefineProperty(columnName + counter.ToString(), PropertyAttributes.None, properyType, Type.EmptyTypes);
                //Get

                MethodBuilder exGetMethod = myType.DefineMethod("get_" + "columnName" + counter, MethodAttributes.Public, properyType, Type.EmptyTypes); ILGenerator getIlgen = exGetMethod.GetILGenerator();
                //IL for a simple getter:
                //ldarg.0 
                //ldfld int32 SilverlightClassLibrary1.Class1::_Age
                //ret 

                getIlgen.Emit(OpCodes.Ldarg_0);
                getIlgen.Emit(OpCodes.Ldfld, exField);

                getIlgen.Emit(OpCodes.Ret);
                exProperty.SetGetMethod(exGetMethod);

                //Set

                MethodBuilder exSetMethod = myType.DefineMethod("set_" + "columnName" + counter, MethodAttributes.Public, null, new Type[] { properyType }); ILGenerator setIlgen = exSetMethod.GetILGenerator();
                //IL for a simple setter:
                //ldarg.0 
                //ldarg.1 
                //stfld int32 SilverlightClassLibrary1.Class1::_Age
                //ret 

                setIlgen.Emit(OpCodes.Ldarg_0);
                setIlgen.Emit(OpCodes.Ldarg_1);

                setIlgen.Emit(OpCodes.Stfld, exField); setIlgen.Emit(OpCodes.Ret);
                exProperty.SetSetMethod(exSetMethod);

                counter++;

            }
            finished = myType.CreateType();
0 голосов
/ 12 июля 2011

если вы работаете с двумерным массивом, то динамическое добавление столбцов, как показано выше, не будет работать. Проблема в том, что Silverlight не может понять привязку столбцов к списку.

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

этот работал для меня

http://www.scottlogic.co.uk/blog/colin/2010/03/binding-a-silverlight-3-datagrid-to-dynamic-data-via-idictionary-updated/

0 голосов
/ 12 июня 2009

Вы можете динамически устанавливать столбцы с их связанными привязками (гарантируя, что AutoGenerateColumns выключена):

Например, столбец имени:

DataGridTextColumn txtColumn = new DataGridTextColumn(); textColumn.Header = "Name"; textColumn.Binding = new Binding("FirstName"); myDataGrid.Columns.Add(txttColumn);

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

Примечание: я уверен, что это изрядное количество размахиваний руками (не касался Silverlight более года); но я надеюсь, что этого достаточно, чтобы сформулировать другую стратегию.

...