четверг, 25 февраля 2010 г.

Сохранение/Загрузка ObservableCollection

Вопрос: How to save, load ObservableCollection?

В принципе задачка Serialize/Deserialize объектов достаточно простая, но вдруг кто не знает.

Создаем класс People

public class People
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime BornDate { get; set; }
public string Email { get; set; }
}

Добавляем пространства имен, для удобства.

using System.Collections.ObjectModel;
using System.IO;
using System.Xml.Serialization;

А вот и наша коллекция:

private ObservableCollection<People> _Peoples;


Название файла для сохранения/загрузки лучше оформить отдельной переменной:

private string _FileName = "peoples.data";


Ну а теперь собственно и сами методы.

Загрузка данных:

private void LoadData()
{
if (File.Exists(_FileName))
{
using (var reader = new StreamReader(_FileName))
{
var xs = new XmlSerializer(typeof(ObservableCollection<People>));
_Peoples = (ObservableCollection<People>)xs.Deserialize(reader);
}
}
else
{
_Peoples = new ObservableCollection<People>();
}           
}

Сохранение данных:

private void SaveData()
{
using (var writer = new StreamWriter(_FileName))
{
var xs = new XmlSerializer(typeof(ObservableCollection<People>));
xs.Serialize(writer, _Peoples);
}        
}

Для отображения списка можно воспользоваться ListBoxwpf


Для этого в xaml файл добавляем:

<ListBox x:Name="list" Width="Auto">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding FirstName}" Width="50"  />
<TextBlock Text="{Binding LastName}" Width="50"/>
<TextBlock Text="{Binding BornDate, StringFormat=d}" Width="60" />
<TextBlock Text="{Binding Email}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>



Исходники проекта

вторник, 9 февраля 2010 г.

Linq: Как получить из одного списка объектов пронумерованный?

Возникла задача получить из списка объектов (IList<People>) другой, а именно пронумерованный (IDictionary<int,People>). Те получить некоторый аналог ROWNUM (Oracle) или ROWNUMBER (MS SQL Server).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Linq.test
{
class Program
{
static void Main(string[] args)
{
// источник записей
var mans = new[] {
new People { Name = "John", Age = 23 },
new People { Name = "Bob", Age = 12 },
new People { Name = "Bill", Age = 43 },
new People { Name = "Patrick", Age = 69 }
};

// посмотрим что там в списке ;-)
foreach (var man in mans)
{ Console.WriteLine(man.ToString()); }

// получаем проиндексированный список
var counteredMan = GetIndexed(mans);

// собственно выводим его в консоль
foreach (var item in counteredMan)
{ Console.WriteLine(item.Key + " - " + item.Value); }

Console.ReadLine();
}

/// <summary>
///
Получение пронумерованного списка
/// </summary>
/// <param name="pupils"></param>
/// <returns></returns>
private static IDictionary<int, People> GetIndexed(IEnumerable<People> pupils)
{
return pupils.Select((man, i) => new
{
id = i+1,
man = man
}).ToDictionary(key => key.id, val => val.man);
}
}

/// <summary>
///
Объект для опытов
/// </summary>
public class People
{
public string Name { get; set; }
public int Age { get; set; }

public override string ToString()
{ return "Гражданин " + Name + ", возраст: " + Age; }
}
}

четверг, 4 февраля 2010 г.

vSphere Host update Utility - Инициализатор типа "VirtualInfrastructure.Utils.HttpWebRequestProxy" выдал исключение.

Windows 7 x64 не перестаёт радовать новыми особенностями работы с различными ПО. На этот раз проблема возникла с VMware vSphere Client и VMware vSphere Host Update Utility 4.0.0.0 build 162856. Первый выдал ошибку:

Could Not Connect
Error parsing the server "xxx.xxx.xxx.xxx" "clients.xml" file. Login will continue, contact your system administrator.

Для решения данной проблемы необходимо:

Для решения проблемы запуска VMware vSphere Client нужно выполнить шаги 1-4, шаг 5 необходим для исправления ошибки в VMware vSphere Host Update Utility.

1. Создать каталог C:\Program Files (x86)\VMware\Infrastructure\Virtual Infrastructure Client\Launcher\lib ;

2. Скопировать в созданный каталог файл system.dll ;

3. Создать переменную среды DEVPATH с значением – “C:\Program Files (x86)\VMware\Infrastructure\Virtual Infrastructure Client\Launcher\lib” ;

4. Добавить в файл VpxClient.exe.config строчки выделенные жирным шрифтом:

<?xml version="1.0" encoding="utf-8"?>
<
configuration>
<
system.net>
<
connectionManagement>
<
clear/>
<
add address="*" maxconnection="8" />
</
connectionManagement>
</
system.net>
<
appSettings>
<
add key = "protocolports" value = "https:443"/>
</
appSettings>
<
runtime>
<
developmentMode developerInstallation="true"
/>
</
runtime
>
</
configuration>



5. Создать файл VIUApp.exe.config в каталоге - C:\Program Files (x86)\VMware\Infrastructure\VIUpdate 4.0


Со следующим содержимым:



<?xml version="1.0" encoding="utf-8"?>
<
configuration>
<
runtime>
<
developmentMode developerInstallation="true" />
</
runtime>
</
configuration>


Все.