Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поле со списком в DataGrid, WPF 
:(
    Опции темы
eXplowar
Дата 18.7.2010, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 18.7.2010

Репутация: нет
Всего: нет



В этом ComboBox  должен быть список с содержимым вида "Петров Алексей", где фамилия и имя берутся из разных столбцов связанной таблицы. В принципе задача простая, но правильно написать строку Binding'а в XAML мой скил не позволяет.
PM MAIL   Вверх
fvoice
Дата 19.7.2010, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 28.4.2009

Репутация: нет
Всего: нет



Что значит связанная таблица? Источник данных? Какой конкретно вы используете?

Вашу задачу можно решить множеством способов, например самые простые:

1. Переопределить ToString() у объекта, массив которых будет в ItemsSourse.
2. Добавить в объект вычисляемое поле которое будет отображать нужное вам значение, и указать его в DisplayMemberPath комбобокса.
3. Использовать MultiBinding и/или Converter
4. Определить стиль для ComboBoxItem, например

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

P.S.
не заметил сразу что вы о datagrid, но в любом случае, раз вы используете комбобокс для него нужен отдельный источник данных

Это сообщение отредактировал(а) fvoice - 19.7.2010, 12:56
PM MAIL   Вверх
eXplowar
Дата 19.7.2010, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 18.7.2010

Репутация: нет
Всего: нет



Спасибо что откликнулся.

Имеется очень простая БД Access (прикрепил к посту): Журнал (КодЗаписи, КодКлиента, Информация), Клиенты (КодКлиента, Фамилия, Имя). Связь один ко многим.
Необходимо сделать так, чтобы в ComboBox DataGrid'a (Журнал.КодКлиента) отображалось имя и фамилия из таблицы "Клиенты". Аналогия с подстановкой в Access (Полю КодКлиента (тип числовой) таблицы Журнал присваивается элемент управления поле со списком и источник строк: SELECT Клиенты.Фамилия & " " & Клиенты.Имя AS Выражение1, Клиенты.КодКлиента FROM Клиенты; присоединённый столбец: 2)

user posted image

Это сообщение отредактировал(а) eXplowar - 19.7.2010, 14:41

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  MiniLibrary.zip 15,55 Kb
PM MAIL   Вверх
fvoice
Дата 19.7.2010, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 28.4.2009

Репутация: нет
Всего: нет



а какой источник данных используется? простой SQLDataSource?
PM MAIL   Вверх
eXplowar
Дата 19.7.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 18.7.2010

Репутация: нет
Всего: нет



Это не принципиально важно, интересны любые способы это сделать, с разными источниками, но главное чтобы был пример и наиболие простая реализация smile 
PM MAIL   Вверх
fvoice
Дата 20.7.2010, 06:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 28.4.2009

Репутация: нет
Всего: нет



Вчера уже поздно было, вот простая реализация первых двух способов:

Код

<Window x:Class="WpfApplication2.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
    Title="Window1" Height="900" Width="500">
    <StackPanel>
        <Controls:DataGrid Name="Grid" AutoGenerateColumns="False">
            <Controls:DataGrid.Columns>
                <Controls:DataGridTextColumn Header="Код записи" IsReadOnly="True" Binding="{Binding Id}"/>
                <Controls:DataGridComboBoxColumn Header="Клиент" x:Name="Clients" 
                                                 SelectedValueBinding="{Binding Client}"
                                                 SelectedValuePath="Id"/>
                <Controls:DataGridTextColumn Header="Информация" Binding="{Binding Name}"/>
            </Controls:DataGrid.Columns>
        </Controls:DataGrid>
        <Controls:DataGrid Name="Grid2" AutoGenerateColumns="False">
            <Controls:DataGrid.Columns>
                <Controls:DataGridTextColumn Header="Код записи" IsReadOnly="True" Binding="{Binding Id}"/>
                <Controls:DataGridComboBoxColumn Header="Клиент" x:Name="Clients2" 
                                                 DisplayMemberPath="ComputedField"
                                                 SelectedValueBinding="{Binding Client}"
                                                 SelectedValuePath="Id"/>
                <Controls:DataGridTextColumn Header="Информация" Binding="{Binding Name}"/>
            </Controls:DataGrid.Columns>
        </Controls:DataGrid>
    </StackPanel>
</Window>


Код

using System;
using System.Collections.Generic;

namespace WpfApplication2
{
    public partial class Window1
    {
        public Window1()
        {
            InitializeComponent();
            Grid.ItemsSource = Journal.GetTestJournals();
            Clients.ItemsSource = Client.GetTestClients();

            Grid2.ItemsSource = Journal.GetTestJournals();
            Clients2.ItemsSource = Client.GetTestClients();
        }
    }

    public class Client
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Surname { get; set; }
        public DateTime DtBirth { get; set; }
        
        public static IList<Client> GetTestClients()
        {
            IList<Client> clients = new List<Client>();
            clients.Add(new Client {Id = 1, DtBirth = new DateTime(1980, 1,1), Name = "Вася", Surname = "Пупкин"});
            clients.Add(new Client { Id = 2, DtBirth = new DateTime(1970, 1, 1), Name = "Иван", Surname = "Иванов" });
            clients.Add(new Client { Id = 3, DtBirth = new DateTime(1960, 1, 1), Name = "Петров", Surname = "Петров" });
            return clients;
        }

        public override string ToString()
        {
            return string.Format("{0} {1} ({2})", Surname, Name, DtBirth);
        }

        public string ComputedField
        {
            get
            {
                return string.Format("{0} {1} ({2})", Surname, Name, DtBirth);
            }
        }
    }

    public class Journal
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Client{ get; set; }

        public static IList<Journal> GetTestJournals()
        {
            IList<Journal> journals = new List<Journal>();
            journals.Add(new Journal { Id = 1, Name = "Первый", Client = 1});
            journals.Add(new Journal { Id = 2, Name = "Второй", Client = 2});
            journals.Add(new Journal { Id = 3, Name = "Третий" });
            return journals;
        }
    }
}

PM MAIL   Вверх
eXplowar
Дата 20.7.2010, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 18.7.2010

Репутация: нет
Всего: нет



Спасибо за отличный пример, но как это реализовать если данные хранятся на SQL Server или, как в моем случае, в Access? 
PM MAIL   Вверх
fvoice
Дата 21.7.2010, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 28.4.2009

Репутация: нет
Всего: нет



Вы программу в учебных целях пишите? Почему вы используете Access?
Это только мое личное мнение, но в противоположность мнению большинства начинающих программистов, начинающих писать первые программы для Access(особенно читая какие то очень старые книжки), работать с тем же MySQL Server или Express версией SQL сервера гораздо проще(и материала обучающего в разы больше), но это тема для другой ветки.
PM MAIL   Вверх
eXplowar
Дата 22.7.2010, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 18.7.2010

Репутация: нет
Всего: нет



Программированием интересуюсь давно, но все равно считаю себя начинающим программистом. Приходилось из-за учебы бегать от одной технологии к другой, а вот сейчас решил получше разобраться в интересующем меня предмете, в том числе WPF. У меня нет принципа создать ComboBox в DataGride'е, который обязательно должен быть подсоединен к Access. Аксес я взял лишь как пример, сюда на форум, того что я хочу получить (смотри скриншот пару постоми выше). А в прошлом своем посте я спросил
Цитата(eXplowar)
как это реализовать если данные хранятся на SQL Server

Сейчас стараюсь как можно лучше разобраться в Binding'е через XAML. Собственно прошу помощи. Мне кажется нужно использовать DataTemplate, но как...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0775 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.