Тэги

Silverlight (36) WPF (10) IIS (7) Visual Studio (7) SharePoint (6) .Net Framework (5) ODP.NET (5) ASP.NET (4) C# (4) common (4) Network Settings (3) JavaScript (2) MS Office (2) Resharper (2) WCF (2) WEB (2) XPath (2) XSLT (2) ADO.NET (1) APEX (1) CMD (1) CSS (1) EF (1) HTML (1) Hardware bugs (1) Java (1) MS SQL (1) Oracle (1) PDF (1) Version Control (1) XAML (1)

понедельник, 30 ноября 2009 г.

Silverlight: Общие типы / объекты между двумя WCF - сервисами побыстрому.



Задача: между двумя сервисами передавать общий объект одного класса (типа) на стороне клиента.
Т.е. Silverlight получает кастомный объект из одного сервиса, обрабатывает его и передает в другой сервис/ы.

Чтоб сделать так, вынесите общий тип в общий проект.
Этот проект должен быт Silverlight class library.
Мне даже не пришлось выкидывать конфликтующие с полным .NET Framework сборки при добавлении референса на общий Silverlight проект в проект Web-сайта.
Видимо, это будет работать пока не испольуются какие-либо сложные типы, например List<ЧтоТо>.

Оказалось в WCF задача решается, как и в обычных Web-сервисах ASP.NET – через внешнюю сборку, на которую ссылаются оба проекта - и клиент и сервис.

Но есть еще проблема с INotifyPropertyChanged.
Нельзя создать общий проект / сборку содержащую класс, наследованный от INotifyPropertyChanged, потому что этот интерфейс определен в сборке System для Silverlight, но не для полного .NET Framework.

Вот такая ошибка получается при этом:
The type 'System.ComponentModel.INotifyPropertyChanged' is defined in an assembly that is not referenced. You must add a reference to assembly 'System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e'.



Для INotifyPropertyChanged я испоьзую класс-посредник, который размещен только в проекте клиента Silverlight:
public class myMediator : INotifyPropertyChanged{
private MySharedClass mySharedClass;

    public String Name{
        get{ return mySharedClass.Name; }

        set{
            mySharedClass.Name = value;
            RaisePropertyChanged(“Name”);
        }
    }

        . . . . .

}

В таком решении я получаю действительно общие типы, а не общий код, как при подходах расшаривания логиги между Silverlight и полным .NET Framework.
Хотя общий код тоже бывает полезен, но пока до этого руки не дошли.
Теперь можно часто перегенерировать сервисы без заморочек и без внешних утилит командной строки для сложных случаев.

Есть и более детальный подход на это решение, кому интересно посмотрите это Sharing Entities between WCF and Silverlight (EN).

Silverlight: В TreeView в XAML нельзя помещать вперемешку TreeViewItem и другие элементы.


Unhandled Error in Silverlight Application
Code: 1001
Category: ParserError
Message: AG_E_UNKNOWN_ERROR
File:
Line: 123
Position: 321

Если в TreeView или в TreeViewItem поместить в разметке вперемешку TreeViewItem и другие элементы, то при установке

item.IsExpanded = true;

получите выше приведенное исключение.

Обнаружено в Silverlight 3 Toolkit October 2009


четверг, 26 ноября 2009 г.

ASP.NET: Приложение сервера недоступно

Текст ошибки:

Приложение сервера недоступно

Web-приложение, к которому вы пытаетесь обратиться на этом веб-сервере, в данный момент недоступно.  Нажмите кнопку "Обновить" в своем веб-обозревателе для повтора запроса.
Замечание администратора: Сообщение об ошибке, подробно поясняющее причину сбоя данного конкретного запроса, находится в журнале событий приложений на веб-сервере. Ознакомьтесь с этой записью в журнале и выясните причину ошибки.
Одна из причин:
В папке в которой находяться файлы сайта нет прав для запуска ASP.NET.
Например для Widows XP для сайта разработки достаточно добавить на папку сайта учетку ASP.NET, но она есть только в Win XP, поэтому чтоб не запоминать, сделайте права на папку сайта такие же, как в папке сайтов IIS по умолчанию.
Это C:\Inetpub\wwwroot.
Даже если ваша папка сайта (приложения) лежит в C:\Inetpub\wwwroot, то всеравно проверте на ней права, тк они могут отстутствовать, например из-за выгрузки папки сайта целиком из SVN.
Характерная черта этой ошибки, что в логах сервера IIS (обычно C:\WINDOWS\system32\Logfiles\W3SVC1) вы получаете что-то типа
11:22:11 127.0.0.1 GET /WebSite1/Default.aspx 500
и при этом, при дебаггинге сайта в Visual Studio не попадаете на обработчик события Application_Error, который по умолчанию определен в файле Global.asax

среда, 25 ноября 2009 г.

Linq: Метод var res = (Linq Expression).ToDictionary(p => p.ID) неработает с анонимными типами полученными в select выражения Linq.

Вот это работать будет

var res = (from item in SomeList
    select new SomeClass()
        {
            ID = item.Id,
        }
).ToDictionary<SomeClass, Int64>(p => p.ID);
А вот это нет
var res = (from item in SomeList
    select new
        {
            ID = item.Id,
        }
).ToDictionary(p => p.ID);

Чтоб это обойти нужно просто исопльзовать ToDictionary, принимающий два делегата Func, а не однин.
Например:
var res = (from item in SomeList
    select new
        {
            ID = item.Id,
        }
).ToDictionary(p => p.ID, p=>p);

Первый делегат вернет ключь, второй значение для словаря.

Silverlight: Улучшенный TreeView с CheckBox. Добавил детальное представление и фильтрацию элементов для детального представления - TreeView Using CheckBoxes improvement



Есть в Silverlight Toolkit пример Using CheckBoxes in a TreeView – Использование чекбоксов в дереве. Я его срочно доработал :).

Посмотреть готовый припер вы можете сразу по этой ссылке Check Hierarhy Perfect

Скачать проект здесь.

В Silverlight есть TreeView в котором вставлены CheckBox. Изменение этих CheckBox связано как вверх по иерархии, так и вниз.
Как это работает в Toolkit можно посмотреть здесь (внимание, долго грузиться, тк сразу все примеры из Toolkit).
Я чуть-чуть доработал это приер и вот что мне удалось туда добавить

  • работа с детальным представление и чтоб в изменения в детальном представлении изменяли отображение самого TreeView

  • Избавиться от обработчика события клика по элементу дерева

  • Дабавил возможность разделения элементов между деревом и детальным представлением. Например у структуре организации у вас есть подразделения и сотрудники и вы хотите в дереве отобаржать только подразделения, а в детальном DataGrid или другом TreeView сотрудников. Ну по псякому может быть.

  • Я делал сразу, чтоб в отличии от Silverlight Toolkit у меня поддерживался Drag & Drop, но тестировать это нет никакого времени, извините

  • Также, в отличии от Toolkit, поддерживается динамическое изменение всех трех коллекций в коде.

  • Все три коллекции синхронизированы


от 27.09.2009

  • Убрал дурацкое промежуточное состояние Null на родительском чекбоксе при клике. Это когда в примере на Silverlight Toolkit кликаем по родительскому чекбоксу, а он вместо перехода с Checked на Unchecked переходит в промежуточное третье состояние, когда свойство (Boolean?) IsChecked = null. Это так раздражает :)

  • По просьбе коллег по умолчанию сделал все чекбоксы выделенными (IsChecked = true). Вы можете это сами переопределить для себя в классе установив
    private Boolean? _isCheckedFild_ = false; или private Boolean? _isCheckedFild_ = null; вместо private Boolean? _isCheckedFild_ = true;


Три коллекции, это где все элементы, где помеченные элементы и где не помеченные элементы. Например в моем приммере, в верхней части все элементы а в нижней в дереве помеченные (группы), а в детальном представлении в DataGrid не помеченные (сотрудники). Ну тут возможны вариации.

Все это работает на одном абстрактном классе CheckHierarhy, который вы должны наследовать для добавления ваших полей.
Пока я не прекрутил это к данным с Web-сервера, так что могут быть изменения.

Все я погнал дальше работать, мне уже не до этого :).

вторник, 24 ноября 2009 г.

WPF: DataGrid в WPF не поддерживает полноценной работы с валидацией, в отличии от Silverlight DataGrid



На данный момент я не нашел способа программно в UI (!!! а не в бизнес объектах) определить, валидны ли строки или ячейки в DataGrid WPF.

Стандартные уловки с LogicalTreeHelper.GetChildren(...) и Validation.GetHasError(...) на теперешнем июльском 2009 DataGrid не работают.

А вот разработчики Silverlight Toolkit такого промоха не допустили.

Вот и пригодился мой подход с самопальными Validation Groups как у ASP.NET, который я притянул в WPF и о котором писал ранее.

Так что, не все так хорошо в датском королевстве :)

Но ждем лучшего, т.к. .NET Framework 4 не загорами.

вторник, 17 ноября 2009 г.

Microsoft Web Platform Installer 2.0 у меня как-то криво ставит Silverlight 3



Unable to start debugging. The Silverlight managed debugging package isn't installed

Попробуйте переустановить Microsoft® Silverlight™ 3 Tools for Visual Studio 2008 SP1, только не используйте для этого
Web Platform Installer 2.0.
И еще, хоть Microsoft® Silverlight™ 3 Tools for Visual Studio 2008 SP1 и не поддерживает Widows Server 2003, но всеравно там работает.

У этой проблемы есть и более стандартный ответ, но с ним вам поможет Google.com, который вам скажет, что у вас не установлен Silverlight Developer Runtime. Это одна из частей, как раз вхдящая в Silverlight™ 3 Tools for Visual Studio 2008 SP1.

Вообще  корень проблемы в том, что Microsoft Web Platform Installer 2.0 у меня ставит как-то криво, что даже Silverlight на работает.

пятница, 13 ноября 2009 г.

Silverlight: DataGrid – динамическое добавление колонок в DataGrid с динамическими инменами колонок, с поддержкой DataPager. Должно сработать и для WPF.



Silverlight: DataGrid – динамическое добавление колонок в DataGrid с динамическими инменами колонок, с поддержкой DataPager.
Должно сработать и для WPF (возможно при доработке), но для WPF, видимо, лучше использовать в качестве низлежащего объекта данных DataTabel.
В Silverlight класс DataTabel не существует.

Главное условие – сейчас поддерживается максимально до 20 колонок, но это количество не ограничено, просто фиксированно в коде. Правте код сами, кому надо.

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

Решению всеравно, что вы используете, List<> или ObservableCollection<>.

Типы данных которые не поддерживаются добавте сами, это просто сделать по аналогии с имеющимся в проекте коде.
Сейчас поддерживаются String, Int32, Decimal, Double, DateTime.

За целостность данных вы отвечаете сами. Я имел ввиду, что нет проверки как в DataTabel, что вы добавляете верный тип данных. Т.е. если вы начили в первую колонку добавлять число, то должны добавлять число в остальные колонки.
Правда можете добавлять null, только не забывайте даже null обарачивать в специальный объект.

Project DataGrid Dynamic Columns for Visual Studio 2008 Silverlight 3
Возможно вам потребуется установить Silverlight Toolkit для DataGrid и DataPager, чтоб проект собирался.

Если будут желающие я объясню, что там делается.

___

Доработки 26.11.2009
По просьбе трудящихся добавил свойство для детальной информации, которое отдельно можно отрисоваться в детальной части строки DataGrid. Свойство не типизировано.

понедельник, 9 ноября 2009 г.

Silverlight 3: задание Foreground на строке DataGrid не приводить к изменению цвета



Поэтому надо задавать в контенте, например на TextBox.

Как кастомизировать DataGrid через код есть в сети, но если что - напишу.

четверг, 5 ноября 2009 г.

Внимание! Добавление элементов в XAML Resource Dictionary из того же проекта, где расположен сам файл ресурсов



Вы приеняете тему из Silverlight Toolkit или свою тему с помощью ImplicitStyleManager и решили добавить в файл темы свои разработанные элементы, причем файл темы и ваши элементы лежат в одном проекте.
ImplicitStyleManager в Silverlight будет рвать в этом случае!

Обратите внимание, что автоматически подставляемая XML ссылка на namespace в вашем проекте получается без указания на сборку текущего проекта. Это обычное явление. Вот что вы получите при добавлении XML-референса в файл темы

xmlns:customControls="clr-namespace:MyProject.CustomControls"

А виноват в том, что рвется недоработанный ImplicitStyleManager. Он не переваривает XML-референсы без указания на сборку. Вот такой он :)
themingToolkit:ImplicitStyleManager.ResourceDictionaryUri="Themes/Generic.xaml"

Лечиться это легко, в вашем xmlns: добавте assembly=MyProjectAssemblyName
В результате вы получите:

xmlns:customControls="clr-namespace:MyProject.CustomControls; assembly=MyProjectAssemblyName"

Вуаля, работайте дальше.

Для поисковиков приведу возникающие при этом ошибки

Ошибка: Unhandled Error in Silverlight Application
Code: 2255
Category: RuntimeError
Message: AG_E_PARSER_BAD_TYPE
MethodName:

Unhandled Error in Silverlight Application AG_E_PARSER_BAD_TYPE [Line: 46 Position: 81]

Ну как-то так :)
Я про это как-то видел на форумах (EN), но тогда не обратил внимание на стонания бедного индуса :)

среда, 4 ноября 2009 г.

Типизированные DataSet - труд коту под хвост. С ADO.NET EntityFramework веселее, но она не поддерживает хранимые процедуры (сейчас)

Очередной раз сижу и злюсь на себя, что связался с типизированными DataSet!
С ними только на собеседованиях пыль в глаза пускать.
Только ADO.NET, чистый ADO.NET и ничего большего в серьезном проекте! Прям как в книгах заговорил :) .
У меня немного поменялась схема в базе данных и какие-то типизированные датасеты слетели полностью, какие-то вылетают в рунтайме из-за того, что поле ID не может быть NULL, и т.д. и т.п., и т.д. и т.п.
Как это достало! Вот, в одном проекте сделал все на ADO.NET и ADO.NET Entity Framework немного, так мило дело теперь маштабировать (изменять, дорабатывать, наращивать) при случае.
Теперь сижу и сверяю настройки датасетов из старой версии проекта который поднял из системы контроля версий.
ADO.NET Entity Framework конечно поприятнее, но по сути это работа над ошибками в DataSet’s, а еще эта сладость не поддерживает импорт хранимых процедур в код приложения. Разработчики говорят, что им не хватило времени на это. Можно только импортить как Select, Update, Insert замены обычным запросам.
Конечно можно изловчиться и заставить сымпортить хранимки, но жизнь у нас одна и не стоит ее тратить на незрелые продукты. Есть еще, правда, ADO.NET Entity Framework Extensions, но я всетаки дождусь релиза.
Вон как поносят эту недороботку Entity Framework:
Google: entity framework function import scalar (EN)
import a function that returns a scalar value (EN)
Entity Framework Problems: Mapping stored procedures to non-insert,update,delete (EN)
P.S. Таки настроил свои датасеты и уже забыл про все негативное, что про них написал здесь :)

воскресенье, 1 ноября 2009 г.

Версионность на уровне базы начиная с MS SQL 2008 в релизе Enterprise

Коллеги, в MS SQL 2008, в самом дорогом релизе Enterprise есть версионность на уровне базы данных.
Она поддерживает администрирование, авто-удаление и другие полезные фичи.
Т.к. версионность доступна только с редакции Enterprice, то можно сказать, что никакой версионности в MS SQL 2008 нет :), но все-таки.
Система отслеживания измененных данныхСистема отслеживания измененных данных регистрирует действия по вставке, обновлению и удалению, применяемые к таблицам SQL Server, сохраняя подробности операций изменения в легко обрабатываемом реляционном формате. Таблицы изменений, используемые системой отслеживания измененных данных, содержат столбцы, отражающие структуру столбцов отслеживаемой исходной таблицы, а также метаданные, необходимые для понимания того, какие изменения произошли.

Система отслеживания изменений в данных доступна только в следующих выпусках: Enterprise, Developer и Evaluation SQL Server.
Работает это все прозрачно и асинхронно не внося изменения в схему базы данных.
Легко настраивается, легко включается.
Напоминаю, что Enterprice стоит денег :). Не помню точно, но вроде что-то от 50 до 250 тысяч баксов, т.е. от полтора миллиона рублей до семи.
Почитать про такое же решение от Oracle можно здесь Managing History (EN)