powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Не удаётся реализовать выборку в DataGrid при помощи ComboBox
6 сообщений из 6, страница 1 из 1
Не удаётся реализовать выборку в DataGrid при помощи ComboBox
    #38020780
gromzadira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть две сущности: Project и Developer
Они связаны между собой один ко многим.

Создал DataGrid, где отображается весь список Developer`ов.
Сделал ComboBox, куда поместил список всех Project`ов.

Как синхронизировать ComboBox и DataGrid так, чтобы при выборе проекта в ComboBox (допустим project1), DataGrid обновлялся и в нём оставались только Developer`ы, которые связаны с project1?

Код обработчика закрытия контента ComboBox`а:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
        private void projectComboBox_DropDownClosed(object sender, EventArgs e)
        {
              DomainService1 _domainContext = (DomainService1)(developerDomainDataSource.DomainContext);
              Project selectedProject = (Project)projectComboBox.SelectedItem;
              int selectedProjectID = selectedProject.projectID;
              developerDomainDataSource.DataContext = _domainContext.Load(_domainContext.GetDeveloperFilterQuery(selectedProjectID));
              developerDomainDataSource.Load();
              projectComboBox.SelectionChanged+=new SelectionChangedEventHandler(projectComboBox_SelectionChanged);
        }


Код _domainContext.Load(_domainContext.GetDeveloperFilterQuery(selectedProjectID))
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
        public IQueryable<Developer> GetDeveloper()
        {
            return this.ObjectContext.Developer.Include("Project").OrderBy(c => c.developerID);
        }

        public IQueryable<Developer> GetDeveloperFilter(int selectedProjectID)
        {
            return this.ObjectContext.Developer.Include("Project").Where(c => c.Project.projectID == selectedProjectID);
        }



Кусок xaml кода с описанием DataGrid и ComboBox
Код: xml
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.
            <ScrollViewer x:Name="PageScrollViewer" Style="{StaticResource PageScrollViewerStyle}" Grid.Row="1" Grid.ColumnSpan="2">
                <sdk:DataGrid IsReadOnly="True" AutoGenerateColumns="False" ItemsSource="{Binding ElementName=developerDomainDataSource, Path=Data}" Name="developerDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" DataContextChanged="developerDataGrid_DataContextChanged">
                    <sdk:DataGrid.Columns>
                        <sdk:DataGridTextColumn x:Name="secondNameColumn" Binding="{Binding Path=secondName}" Header="Second Name" Width="Auto" />
                        <sdk:DataGridTextColumn x:Name="firstNameColumn" Binding="{Binding Path=firstName}" Header="First Name" Width="Auto" />
                        <sdk:DataGridTextColumn x:Name="middleNameColumn" Binding="{Binding Path=middleName}" Header="Middle Name" Width="Auto" />
                        <sdk:DataGridTextColumn x:Name="projectInvolved" Binding="{Binding Path=projectID}" Header="Project" Width="Auto"/>
                        <sdk:DataGridTextColumn x:Name="sexColumn" Binding="{Binding Path=sex}" Header="Sex" Width="Auto" />
                        <sdk:DataGridTextColumn x:Name="yearsOldColumn" Binding="{Binding Path=yearsOld}" Header="Years Old" Width="Auto" />
                        <sdk:DataGridTextColumn x:Name="emailColumn" Binding="{Binding Path=email}" Header="Email" Width="Auto" />
                        <sdk:DataGridTemplateColumn x:Name="dobColumn" Header="Dob" Width="Auto">
                            <sdk:DataGridTemplateColumn.CellEditingTemplate>
                                <DataTemplate>
                                    <sdk:DatePicker SelectedDate="{Binding Path=dob, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" />
                                </DataTemplate>
                            </sdk:DataGridTemplateColumn.CellEditingTemplate>
                            <sdk:DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Path=dob, StringFormat=dd:MMMM:yyyy}" />
                                </DataTemplate>
                            </sdk:DataGridTemplateColumn.CellTemplate>
                        </sdk:DataGridTemplateColumn>
                        <sdk:DataGridTextColumn x:Name="passportNumberColumn" Binding="{Binding Path=passportNumber}" Header="Passport Number" Width="Auto" />
                        <sdk:DataGridTextColumn x:Name="phoneNumberColumn" Binding="{Binding Path=phoneNumber}" Header="Phone Number" Width="Auto" />
                    </sdk:DataGrid.Columns>
                </sdk:DataGrid>
            </ScrollViewer>
            <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:Developer, CreateList=true}" Height="0" LoadedData="developerDomainDataSource_LoadedData" Name="developerDomainDataSource" QueryName="GetDeveloperQuery" Width="0" Margin="0,0,124,69" IsEnabledChanged="developerDomainDataSource_IsEnabledChanged" SubmittedChanges="developerDomainDataSource_SubmittedChanges">
                <riaControls:DomainDataSource.DomainContext>
                    <my:DomainService1 />
                </riaControls:DomainDataSource.DomainContext>
            </riaControls:DomainDataSource>

 <ComboBox Grid.Column="2" Height="23" HorizontalAlignment="Left" ItemsSource="{Binding ElementName=projectInvolved}" Margin="18,24,0,0" Name="projectComboBox" VerticalAlignment="Top" Width="120" DropDownClosed="projectComboBox_DropDownClosed">
                <ComboBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel />
                    </ItemsPanelTemplate>
                </ComboBox.ItemsPanel>
...
Рейтинг: 0 / 0
Не удаётся реализовать выборку в DataGrid при помощи ComboBox
    #38020982
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В модели фильтровать ItemsSource датагрида по SelectedItem комбобокса.
http://msdn.microsoft.com/en-us/library/ff407126%28v=vs.110%29.aspx
P.S. Использовать FilterEventHandler в code-behind, как в примерах по ссылке, вовсе необязательно - у ListCollectionView есть свойство Filter, которое Predicate<object> - его тоже вполне можно использовать: http://msdn.microsoft.com/en-us/library/ms752348.aspx
...
Рейтинг: 0 / 0
Не удаётся реализовать выборку в DataGrid при помощи ComboBox
    #38021584
gromzadira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возник следующий косяк - при добавлении элемент в БД.

элемент создаётся и добавляется через _domainContext.Add(newDeveloper);
Добавление происходит нормально, элемент появляется в БД (в файле .dbo), но на экране никак не отображается ни при каких обновлениях (даже в контекстах и датах элементов _domainContext и developerDomainDataSource никак не отображаются эти изменения, метод GetDeveloperQuery тоже возвращает старый список девелоперов без добавленного элемента)
А если, после такого добавления пытаться добавить ещё один элемент, то пишет, что сущность с таким ID уже есть (что в принципе логично, она ведь действительно есть).

При этом удаление элемента проходит на ура.

Код: 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.
        void dev_Closed(object sender, EventArgs e)
        {
            AdditionDeveloper addDev = (AdditionDeveloper)sender;
            if (addDev.newDeveloper != null)
            {
                DomainService1 _domainContext = (DomainService1)(developerDomainDataSource.DomainContext);
                var developerEnumerator = _domainContext.Developers.GetEnumerator();
                while (developerEnumerator.MoveNext())
                    addDev.newDeveloper.developerID = developerEnumerator.Current.developerID;
                addDev.newDeveloper.developerID++;
                _domainContext.Developers.Add(addDev.newDeveloper);
                //_domainContext.SubmitChanges();
                developerDomainDataSource.SubmitChanges();
            }
            //developerDomainDataSource.SubmittedChanges += new EventHandler<SubmittedChangesEventArgs>(developerDomainDataSource_SubmittedChanges);
        }


        private void developerDomainDataSource_SubmittedChanges(object sender, SubmittedChangesEventArgs e)
        {
            //developerDomainDataSource.LoadedData+=new EventHandler<LoadedDataEventArgs>(developerDomainDataSource_LoadedData);
            if (e.HasError)
            {
                MessageBox.Show(string.Format("Changes were not saved: {0}", e.Error.Message));
                e.MarkErrorAsHandled();
            }
        }

        private void button4_Click(object sender, RoutedEventArgs e)
        {
            DomainService1 _domainContext = (DomainService1)(developerDomainDataSource.DomainContext);
            _domainContext.Developers.Remove((Developer)developerDataGrid.SelectedItem);
            developerDomainDataSource.SubmitChanges();
        }  // Delete
...
Рейтинг: 0 / 0
Не удаётся реализовать выборку в DataGrid при помощи ComboBox
    #38022391
gromzadira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё есть задание создать генератор, чтобы забивать БД n-ым количеством записей (около 500 000 для проверки).

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
        private void button3_Click(object sender, RoutedEventArgs e)
        {
            DomainService1 _domainContext = (DomainService1)(developerDomainDataSource.DomainContext);
            Random rand = new Random();
            Developer newDeveloper = new Developer();
            for (int i = 0; i < 2; i++)
            {
                // Тут генерятся данные по всем правилам

                var developerEnumerator = _domainContext.Developers.GetEnumerator();
                while (developerEnumerator.MoveNext())
                    newDeveloper.developerID = developerEnumerator.Current.developerID;
                newDeveloper.developerID++;
                // на строчки выше можно не обращать внимания - это высчет последнего ID, у
                // меня инкремент ID вручную делается

                _domainContext.Developers.Add(newDeveloper);
                developerDomainDataSource.SubmitChanges();
                developerDomainDataSource.SubmittedChanges += new EventHandler<SubmittedChangesEventArgs>(developerDomainDataSource_SubmittedChanges); 
            }
        } // Generate



Так вот проблема в том, что первая запись добавляется шикарно, а вот вторая ругается на занятость потока (типа первая ещё толи добавляется, толи грузится в контекст DataGrid), как с этим бороться?
Пробовал слипать поток, либо просто писать бред, чтобы застопить прогу, типа
Код: c#
1.
2.
while (developerDomaiDataSource.IsSubmitChanges)
 i = i + 1 - 1;



не помогло
...
Рейтинг: 0 / 0
Не удаётся реализовать выборку в DataGrid при помощи ComboBox
    #38025222
gromzadira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все предыдущие вопросы решились, возник последний:

Задача: создать возможность переводить разработчика в другой проект.

Выбираю проект из списка (selectProject) и...
...
Рейтинг: 0 / 0
Не удаётся реализовать выборку в DataGrid при помощи ComboBox
    #38025226
gromzadira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gromzadira,

и беру разработчика, которого переводим, получается

Код: c#
1.
2.
selectDeveloper.projectID = selectProject.projectID;
developerDomainDataSource.SubmitChanges();



Операция сабмита выдаёт ошибку "Не пройдена проверка операции submit. Дополнительные сведения см. в свойстве Entity.ValidationErrors для каждой сущности в коллекции EntititesInError."

ЗЫ селекты все правильные, присвоение ID идёт нормально, это проверял, но операция сабмита не проходит.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Не удаётся реализовать выборку в DataGrid при помощи ComboBox
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]