4 / 4 / 1
Регистрация: 12.10.2010
Сообщений: 32
1

DataGridComboBoxColumn биндинг

24.11.2010, 00:56. Показов 2423. Ответов 7
Метки нет (Все метки)

Доброго времени суток! Помогите пожалуйста, завис на одном моменте. Есть следующий код (Id_p это массив уникальных id_person, соответственно класс Person имеет свойство Adr для принятия туда объектов Adress):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
ListPerson List = new ListPerson();
SqlConnection connection = new SqlConnection();
for (int i = 0; i < Id_p.Count; i++)
            {
                Person person = new Person();
                Adress adress = new Adress();
                connection.Open();
                string Str = "SELECT Person.FirstName, Person.SecondName, Person.LastName, Adress.City, Adress.Street, Adress.House, Adress.Korpus, Adress.Flat FROM Adress INNER JOIN PersAdress ON Adress.id_adress = PersAdress.id_adress INNER JOIN Person ON PersAdress.id_person = Person.id_person WHERE (Person.id_person = N'" + Id_p[i] + "')";
                using (SqlCommand command = new SqlCommand(Str, connection))
                {
                    SqlDataReader datareader;
                    datareader = command.ExecuteReader(CommandBehavior.CloseConnection);
                    while (datareader.Read())
                    {
                        person.FirstNames = datareader.GetValue(0).ToString().Trim();
                        person.SecondNames = datareader.GetValue(1).ToString().Trim();
                        person.LastNames = datareader.GetValue(2).ToString().Trim();
                        adress.Citys = datareader.GetValue(3).ToString().Trim();
                        adress.Streets = datareader.GetValue(4).ToString().Trim();
                        adress.Houses = datareader.GetValue(5).ToString().Trim();
                        adress.Korps = datareader.GetValue(6).ToString().Trim();
                        adress.Flats = datareader.GetValue(7).ToString().Trim();
                        person.Adr.Add(adress);
                    }
                    datareader.Close();
                    List.Add(person);
                }
                connection.Close();
            }
MainGrid.DataContext = List;
Таким образом я заполняю List уникальными людьми. Теперь мне все это надо отобразить в датагриде, причем у людей может быть несколько адресов, поэтому для отображения адресов взял DataGridComboBoxColumn. Так вот вопрос: как забиндить DataGridComboBoxColumn с адресами из List?? Причем ФИО биндится нормально, а вот адреса никак. Вот еще XAML:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Window x:Class="WPFBook.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <DockPanel LastChildFill="True">
        <DataGrid DockPanel.Dock="Top" AutoGenerateColumns="False" Name="MainGrid" ItemsSource="{Binding}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Фамилия" Binding="{Binding FirstNames}"/>
                <DataGridTextColumn Header="Имя" Binding="{Binding SecondNames}"/>
                <DataGridTextColumn Header="Отчество" Binding="{Binding LastNames}"/>
                <DataGridComboBoxColumn Header="Адрес" ItemsSource="{Binding Adr}"/>
            </DataGrid.Columns>
        </DataGrid>
    </DockPanel>
</Window>
Заранее благодарен!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.11.2010, 00:56
Ответы с готовыми решениями:

Биндинг DataGridComboBoxColumn
Есть класс public class Manager { public string customer_name { get; set; } ...

DataGridComboBoxColumn биндинг
Есть приложение WPF + работа с данными в Code First. Модель public class Person { public...

DataGridComboBoxColumn
Господа выручайте, не получается заполнить DataGridComboBoxColumn, потратил на это уже кучу...

DataGridComboBoxColumn
Такая проблема. есть 3 таблицы Typ, Wertart и таблица Typ_Wertart, таблица Typ_Wertart содержит...

7
burning1ife
1447 / 1269 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
24.11.2010, 03:14 2
а "никак" - это вообще пустой список? или просто в нем не так отображается название адреса?
И, кстати, у тебя при таком чтении всегда будет 1 адрес у человека...

Для твоего случая я бы посоветовал DataGridTemplateColumn, а внутрь него ListView
1
4 / 4 / 1
Регистрация: 12.10.2010
Сообщений: 32
24.11.2010, 12:42  [ТС] 3
Совсем пустой список
0
burning1ife
1447 / 1269 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
24.11.2010, 12:55 4
попробуй сделать так
XML
1
  <DataGridComboBoxColumn Header="Адрес" ItemsSource="{Binding Adr}" DisplayMemberPath="Citys"/>
1
4 / 4 / 1
Регистрация: 12.10.2010
Сообщений: 32
24.11.2010, 23:18  [ТС] 5
не помогло. Достал бубен,открыл гугл, мож чего получится)

Добавлено через 53 минуты
Отбросил бубен, так же как и мысль об использовании DataGridComboBoxColumn и согласился с kenny69!
Использовал DataGridTemplateColumn и все отлично работает.
Вот как теперь это выглядит в XAML:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<Window x:Class="PhoneBookWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <DockPanel LastChildFill="True">
        <DataGrid DockPanel.Dock="Top" AutoGenerateColumns="False" Name="MainGrid" ItemsSource="{Binding}" HorizontalAlignment="Center">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Фамилия" Binding="{Binding FirstNames}" Width="1*"/>
                <DataGridTextColumn Header="Имя" Binding="{Binding SecondNames}" Width="1*"/>
                <DataGridTextColumn Header="Отчество" Binding="{Binding LastNames}" Width="1*"/>
                <DataGridTemplateColumn Header="Адрес" Width="3*">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ListBox ItemsSource="{Binding Adr}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </DockPanel>
</Window>
И как в коде(еще раз спасибо kenny69 на счет ошибки про то, что все время будет один адрес!):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
            for (int i = 0; i < Id_p.Count; i++)
            {
                Person person = new Person();
                List<Adress> Adr = new List<Adress>();
                string Str = "SELECT Person.FirstName, Person.SecondName, Person.LastName, Adress.City, Adress.Street, Adress.House, Adress.Korpus, Adress.Flat FROM Adress INNER JOIN PersAdress ON Adress.id_adress = PersAdress.id_adress INNER JOIN Person ON PersAdress.id_person = Person.id_person WHERE (PersAdress.id_person = '" + Id_p[i] + "')";
                using (SqlCommand command = new SqlCommand(Str, connection))
                {
                    connection.Open();
                    SqlDataReader datareader;
                    datareader = command.ExecuteReader(CommandBehavior.CloseConnection);
                    while (datareader.Read())
                    {
                        Adress adress = new Adress();
                        person.FirstNames = datareader.GetValue(0).ToString().Trim();
                        person.SecondNames = datareader.GetValue(1).ToString().Trim();
                        person.LastNames = datareader.GetValue(2).ToString().Trim();
                        adress.Citys = datareader.GetValue(3).ToString().Trim();
                        adress.Streets = datareader.GetValue(4).ToString().Trim();
                        adress.Houses = datareader.GetValue(5).ToString().Trim();
                        adress.Korps = datareader.GetValue(6).ToString().Trim();
                        adress.Flats = datareader.GetValue(7).ToString().Trim();
                        Adr.Add(adress);
                    }
                    datareader.Close();
                    person.Adr = Adr;
                    List.Add(person);
                }
                connection.Close();
            }
            MainGrid.DataContext = List;
Кстати, чтобы нормально отбражался адрес переопределил метод ToString() в классе Adress вот таким образом:
C#
1
2
3
4
        public override string ToString()
        {
            return string.Format("{0} {1} {2} {3} {4}",Citys,Streets,Houses,Korps,Flats);
        }
Не утверждаю, что у меня получилось изящное решение, но оно работает.

Добавлено через 31 минуту
Я наврал на счет заполнения адресами, код выше не верен.Буду править....
0
burning1ife
1447 / 1269 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
24.11.2010, 23:32 6
так если у тебя все таки 1 адрес, то сделай DataGridTextColumn
XML
1
 <DataGridTextColumn Header="Адрес" Binding="{Binding Adress}" Width="1*"/>
предварительно добавив свойство Adress в свой класс Person:
C#
1
2
3
4
5
6
7
8
public string Adress
{
     get
        {
              return Adr.ToSring();
        }
 
}
1
4 / 4 / 1
Регистрация: 12.10.2010
Сообщений: 32
24.11.2010, 23:41  [ТС] 7
Адрес у меня не один)
Все!!Поулчилось:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
            for (int i = 0; i < Id_p.Count; i++)
            {
                Person person = new Person();
                string PersStr = "SELECT FirstName, SecondName, LastName FROM Person WHERE (Person.id_person = '" + Id_p[i] + "')";
                using (SqlCommand command = new SqlCommand(PersStr, connection))
                {
                    connection.Open();
                    SqlDataReader datareader;
                    datareader = command.ExecuteReader(CommandBehavior.CloseConnection);
                    while (datareader.Read())
                    {
                        person.FirstNames = datareader.GetValue(0).ToString().Trim();
                        person.SecondNames = datareader.GetValue(1).ToString().Trim();
                        person.LastNames = datareader.GetValue(2).ToString().Trim();
                    }
                    datareader.Close();
                }
                connection.Close();
                string AdrStr="SELECT Adress.City, Adress.Street, Adress.House, Adress.Korpus, Adress.Flat FROM Adress INNER JOIN PersAdress ON Adress.id_adress = PersAdress.id_adress WHERE (PersAdress.id_person = '" + Id_p[i] + "')";
                using (SqlCommand command = new SqlCommand(AdrStr, connection))
                {
                    connection.Open();
                    SqlDataReader datareader;
                    datareader = command.ExecuteReader(CommandBehavior.CloseConnection);
                    while (datareader.Read())
                    {
                        Adress adress = new Adress();
                        adress.Citys = datareader.GetValue(0).ToString().Trim();
                        adress.Streets = datareader.GetValue(1).ToString().Trim();
                        adress.Houses = datareader.GetValue(2).ToString().Trim();
                        adress.Korps = datareader.GetValue(3).ToString().Trim();
                        adress.Flats = datareader.GetValue(4).ToString().Trim();
                        person.Adr.Add(adress);
                    }
                    datareader.Close();
                }
                string PhStr = "SELECT Phone.Operator, Phone.Number FROM PersPhone INNER JOIN Phone ON PersPhone.id_phone = Phone.id_phone WHERE (PersPhone.id_person = '" + Id_p[i] + "')";
                using (SqlCommand command = new SqlCommand(PhStr, connection))
                {
                    connection.Open();
                    SqlDataReader datareader;
                    datareader = command.ExecuteReader(CommandBehavior.CloseConnection);
                    while (datareader.Read())
                    {
                        Phone phone = new Phone();
                        phone.Operators = datareader.GetValue(0).ToString().Trim();
                        phone.Numbers = datareader.GetValue(1).ToString().Trim();
                        person.Phon.Add(phone);
                    }
                    datareader.Close();
                    List.Add(person);
                }
            }
            MainGrid.DataContext = List;
А выглядит это так:
DataGridComboBoxColumn биндинг
0
4 / 4 / 1
Регистрация: 12.10.2010
Сообщений: 32
24.11.2010, 23:44  [ТС] 8
Еще раз огромнное спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2010, 23:44

Привязка в DataGridComboBoxColumn
Ребят , помогите пож та разобраться с привязкой в WPF. У меня есть грид, он связан с коллекцией ...

Заполнение DataGridComboBoxColumn
Добрый день. Одно из полей DataGrid'а DataGridComboBoxColumn: &lt;DataGridComboBoxColumn...

Проблемы с DataGridComboBoxColumn
Здравствуйте. Обрисую ситуацию - есть форма с элементом DataGrid, в котором имеются столбцы -...

Заполнение DataGridComboBoxColumn из базы
Здравствуйте. Как заполнить DataGridComboBox данными из БД? Есть DataGrid, в котором данные о...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.