Создание и заполнение пользовательских скинов списков с помощью C # winforms - PullRequest
1 голос
/ 23 июня 2011

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

Образец класса

public class BeerData
{
    public string imageUrl { get; set; }
    public string name { get; set; }
    public string brewery { get; set; }
    public string beer { get; set; }
    public double reiting { get; set; }
    // ...
}

Личное усилие

В данный момент я использую datagridview

private BindingSource bs = new BindingSource();
// ...

bs.DataSource = typeof(BeerData);
foreach (BeerData entry in new BeerData[]{ new BeerData()
{
    reiting = 4.2,
    name = "Bell's Hopslam Ale",
    brewery = "Bell's Brewery, Inc",
    beer = "Imperiial IPA",
    image = "http://upload.wikimedia.org/wikipedia/" +
    "commons/6/60/Kriek_Beer_1.jpg"
}/* , ... */})
    bs.Add(entry);

grid.DataSource = bs;
grid.AutoGenerateColumns = true;

lName.DataBindings.Add(new Binding("Text", bs, "name"));
lImage.DataBindings.Add(new Binding("ImageLocation", bs, "image"));
// ...

Личное усилие 2

public static class BeerLoader
{
    public static List<BeerData> result = new List<BeerData>();
    static BeerLoader() {
        add1BogusDataInstance();
    }
    public static void add1BogusDataInstance()
    {
        foreach (BeerData entry in new BeerData[]{ new BeerData()
        {
            reiting = 4.2,
            name = "Bell's Hopslam Ale",
            brewery = "Bell's Brewery, Inc",
            beer = "Imperiial IPA",
            imageUrl = "http://upload.wikimedia.org/wikipedia/" + 
            "commons/6/60/Kriek_Beer_1.jpg"
        }})
            result.Add(entry);
    }
    public static List<BeerData> LoadData()
    {
        return result;
    }
}

Образец желаемого результата

Пример части списка, которая заменит представление данных

image of desired output

Изображение Источник

Вопрос

Я предполагаю, что мне нужно создать user control, а затем создать список этого пользовательского элемента управления или что-то эквивалентное. Не удалось найти пример winform с помощью Google, поэтому я хочу знать, как это сделать.

Ответы [ 2 ]

2 голосов
/ 23 июня 2011

То, как вы отображаете свой «список», заставляет меня думать, что вы могли бы вместо этого использовать ListBox с DrawMode = OwnerDrawFixed и ItemHeight = 64 (или любым другим). Затем в событии DrawItem для ListBox вы можете нарисовать вывод по мере необходимости.

Если вам нужно использовать DataGridView, я бы посмотрел на событие CellPaint и вроде бы сделал то же самое.

0 голосов
/ 23 июня 2011

Хорошо, если бы я использовал wpf DataTemplate:

<Border HorizontalAlignment="Left" BorderThickness="2" Margin="3" 
    Padding="2" CornerRadius="2" BorderBrush="Black" >
    <StackPanel Orientation="Horizontal" >
        <Border HorizontalAlignment="Left" BorderThickness="1" Margin="3"
            CornerRadius="1" BorderBrush="Gray" VerticalAlignment="Top">
            <Image  Width="128" 
                Source="{Binding Path=imageUrl}" ></Image>
        </Border>
        <StackPanel Width="120">
            <Label Content="{Binding Path=name}"/>
            <Label Content="{Binding Path=brewery}"/>
            <Label Content="{Binding Path=beer}"/>
            <StackPanel Width="120" Orientation="Horizontal" >
                <Label Content="AVG Rating: "/>
                <Label Content="{Binding Path=reiting}"/>
            </StackPanel>
        </StackPanel>
    </StackPanel>
</Border>

со статическим поставщиком данных и графическим интерфейсом:

<Window.DataContext>
    <ObjectDataProvider 
        ObjectType="{x:Type local:BeerLoader}" MethodName="LoadData" />
</Window.DataContext>

<StackPanel>
    <Button Content="Add" Click="Button_Click" />
    <ListBox Name="data" ItemsSource="{Binding}" />
</StackPanel>

Я могу получить:

example

что намного лучше и понятнее.

Однако данные не являются статичными, и я еще не нашел обходной путь.

В коде C # мне просто нужно изменить коллекцию с List на ObservableCollection.

...