Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.08.2015, 23:52   #1
Таксист
Пользователь
 
Аватар для Таксист
 
Регистрация: 11.12.2014
Сообщений: 66
По умолчанию Обновление после вставки в DataGridView с другой формы

Имею две формы. На первой "MainForm" расположил TabControl в каждой вкладке TabControl перетащил из DataSources по таблице DataGridView.
Вторую форму "BucketForm" создаю по второму Ленискому завету
Код:
var f = new Forms.BucketForm();
f.Owner = this;
f.ShowDialog();
Во второй форме колдую, изменяю данные которые на первой форме в таблицах.После закрытия второй формы, хочу чтобы данные в DataGridView первой формы обновились. Осуществляю это так
Код:
var main = this.Owner as MainForm;
if (main != null)
{
 
//Первая таблица DataGridView прекрасно обновляется                                   
main.query2TableAdapter.Fill(main.contentDataSet.Query2);
                   
//Вторая таблица  даже после всего ниже перечисленного не обновляется            
main.itemsTableAdapter.Fill(main.contentDataSet.Items);                                
main.tableAdapterManager.UpdateAll(main.contentDataSet);
main.itemsDataGridView.Update();
main.itemsDataGridView.Refresh();                                    
}
Одна таблица обновляется, а другая низа что не хочет, пробовал уже все такое, но не обновляется

Код:
main.itemsTableAdapter.Fill(main.contentDataSet.Items);                                
main.tableAdapterManager.UpdateAll(main.contentDataSet);
main.itemsDataGridView.Update();
main.itemsDataGridView.Refresh();
DataSet у них общий contentDataSet

Последний раз редактировалось Таксист; 06.08.2015 в 23:57.
Таксист вне форума Ответить с цитированием
Старый 07.08.2015, 00:27   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Напрямую через не визуальные классы не пробовали?
Streletz вне форума Ответить с цитированием
Старый 07.08.2015, 06:12   #3
Akeloya
Форумчанин
 
Регистрация: 27.01.2014
Сообщений: 115
По умолчанию

эх были бы вы на WPF, было бы всё проще.

Но гугл говорит о следующем:

У ТС данные из БД загружаются только при открытии формы
дело в том, что в базу у тебя данные попадают напрямую, а не через источник.
В твоём случае есть 2 варианта решения проблемы:
1) Сразу после добавления производить повторную загрузку данных
2) Работать с источником данных, а все сохранения проводить не прямым запросом, а адаптером (только предварительно настроить запросы обновления)
Akeloya вне форума Ответить с цитированием
Старый 07.08.2015, 11:29   #4
Таксист
Пользователь
 
Аватар для Таксист
 
Регистрация: 11.12.2014
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Akeloya Посмотреть сообщение
эх были бы вы на WPF, было бы всё проще.

А почему на WPF все проще в этом плане?
Таксист вне форума Ответить с цитированием
Старый 07.08.2015, 12:02   #5
Таксист
Пользователь
 
Аватар для Таксист
 
Регистрация: 11.12.2014
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
через не визуальные классы[/URL] не пробовали?
Спасибо! Хорошая ссылка
Таксист вне форума Ответить с цитированием
Старый 07.08.2015, 12:19   #6
Akeloya
Форумчанин
 
Регистрация: 27.01.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Таксист Посмотреть сообщение
А почему на WPF все проще в этом плане?
Потому, что взаимосвязь между данными и формой их редактирования прокидывается очень просто.

Есть некоторый класс, в котором хранятся данные, чтобы датагрид увидел изменения, в этом классе реализуется интерфейс INotifyPropertyChanged
Код:
public List<Category> Chiled { get { return _chiled; } set { _chiled = value;OnPropertyChanged("Chiled"); } }
        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        private void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            var handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }

Затем, создается обзорная коллекция, возвращающая соответствующие объекты коллекции:
Код:
private static List<Category> _categories;

public static ObservableCollection<Category> GetCategories()
        {
            return new ObservableCollection<Category>(_categories);
        }
При этом в метод GetCategories можно добавить параметры, работающие в виде фильтра.

На форме вы выкидываете датапровайдер:
Код:
<UserControl.Resources>
        <ObjectDataProvider x:Key="Categories" ObjectType="{x:Type core:Data}" MethodName="GetCategories" IsAsynchronous="True">
        </ObjectDataProvider>
    </UserControl.Resources>
где core:Data - это класс, содержащий тот самый метод GetCategories

как вы могли заметить, GetCategories - статический, соответственно при неинициализированной переменной _categories будет ошибка. Переменная инициализируется при создании экземпляра класса, а вот данные можно загружать в любой момент, после инициализации ошибок при отсутствии данных не будет - будет возвращена пустая коллекция.

Как итог код выше гарантирует в случае инициализации класса Data и наличия объектов в хранилище, присутствие этих объектов в ObjectDataProvider на форме или в контроле. Остается привязать их:

Код:
<TreeView Name="TvCategories" ItemsSource="{Binding Source={StaticResource Categories}}" Grid.Row="0" Grid.ColumnSpan="3" SelectedItemChanged="TvCategories_OnSelectedItemChanged">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate DataType="{x:Type MenuItem}" ItemsSource="{Binding Path=Chiled}">
                    <TextBlock Text="{Binding Title}"></TextBlock>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
Привязка иерархическая, разумеется. Т.е. я в контрол ничего руками не добавляю, я добавляю, как белый человек, данные в модель. А ObjectDataProvider их протягивает до визуализатора.

Если, вдруг, мне нужно принудительно обновить данные, я обращаюсь к ObjectDataProvider

Код:
((ObjectDataProvider)Resources["Templates"]).MethodParameters[0] = Invoice.Type;
            ((ObjectDataProvider)Resources["Templates"]).Refresh();
В коде выше показано так же и ручное добавление данных в параметры ObjectDataProvider


Кода много, но этот код гарантирует то, что данные изменяемые в контроле будут протянуты в объектную модель и данные добавленные в объектную модель попадут в контрол.


Т.е. я нигде не добавляю руками ничего в коллекцию Items контрола. Но всё, что будет изменено в контроле будет изменено и в данных.
Akeloya вне форума Ответить с цитированием
Старый 07.08.2015, 13:24   #7
Таксист
Пользователь
 
Аватар для Таксист
 
Регистрация: 11.12.2014
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Akeloya Посмотреть сообщение

Т.е. я нигде не добавляю руками ничего в коллекцию Items контрола. Но всё, что будет изменено в контроле будет изменено и в данных.
Согласен, неплохо придумано, буду брать на вооружение!
Таксист вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обновление DataGridView Fresh_MaN Windows Forms 4 04.04.2014 14:03
Нужно ли обновление формы после изменении ее размера? dim3740 C# (си шарп) 11 18.03.2014 20:32
Обновление поля формы после создания новой записи создания romanln2012 Microsoft Office Access 2 09.08.2012 14:12
обновление формы после выполнения скрипта Tanzor69 PHP 2 05.02.2012 00:22
Обновление данных подчиненной формы из другой подчиненной формы smoky Microsoft Office Access 2 15.08.2009 15:28