Я использую WPF. , , DataGrid привязывается к базе данных с помощью перетаскивания VisualStudio IDE и падения, и нашел способ, чтобы мое обновление DataGrid и добавить в базу данных в режиме реального времени, используя событие RowEditEnding таким образом:WPF DataGrid RowEditEnding Событие для вызова Обновление
private void Update_WatchList(object sender, DataGridRowEditEndingEventArgs e)
{
UpdateWatchList();
}
private void UpdateWatchList()
{
dsDocControlTableAdapters.DocumentWatchListTableAdapter ta = new dsDocControlTableAdapters.DocumentWatchListTableAdapter();
try
{
DataRowView dr = (DataRowView)documentWatchListDataGrid.SelectedItem;
dsDocControl.DocumentWatchListRow dr1 = (dsDocControl.DocumentWatchListRow)dr.Row;
dr1.EndEdit();
if (dr1.RowState == DataRowState.Detached)
dsDocControl.DocumentWatchList.AddDocumentWatchListRow(dr1);
ta.Update(dr1);
}
catch (Exception ex)
{
MessageBox.Show("Error UpdateWatchList:\n" + ex.Message);
}
}
Это стало результатом долгих проб и ошибка (в течение которого я пропустил, перенесен и снова пропустил назначение на стоматологию), но каким-то образом наткнулся на необходимость вызова EndEdit() в строке для обновления RowState до модификации или отсоединения. Является ли это ожидаемой последовательностью операций для того, что кажется очень нормальным вариантом использования, или есть лучший способ сделать это?
я начал идти по пути добавления обработчика событий CollectionChanged для добавленных строк, но не мог заставить его работать, вероятно, потому, что я не правильно использовать ObservableCollection:
private void documentWatchListDataGrid_Loaded(object sender, RoutedEventArgs e)
{
var dg = (DataGrid)sender;
if(dg==null || dg.ItemsSource == null) return;
var sourceCollection = dg.ItemsSource as ObservableCollection<DataRow>;
if (sourceCollection == null) return;
//sourceCollection.CollectionChanged += new NotifyCollectionChangedEventHandler(Update_WatchList); // never gets called
}
Линия, добавляет, что обработчик закомментирован, потому что я использовал обработчик как RowEditEnding (в первом блоке кода), но независимо от того, что он никогда не относится к этой точке, потому что sourceCollection всегда был нулевым.
Мой вопрос в том, какова наилучшая практика для этого, казалось бы, простой вещи: обновление в реальном времени, поскольку каждая строка изменяется или добавляется в элемент управления WPat datagrid?
Интересно, я создам новый проект WPF, чтобы играть с тем, что вы наметили. Это все еще греческий для меня, но я начинаю делать некоторые связи.Однако, когда вы говорите, что это типично, почему это не так, как среда IDE создает и реализует объекты с созданием набора данных «перетаскивание»? IOW, кажется, что для того, чтобы реализовать этот метод (лучший способ сделать что-то), вы не полагаетесь на идеал делать что-либо помимо компиляции и отладки: которая мне нравится (я режу зубы на Xt/Xm Motif на Unix-системах мой идеал был vi), но крутой кривой обучения. –
Один большой вопрос для меня - это то, как функции TableAdapter воспроизводятся в модели, описанной выше. Другой - это IDE, который сопоставляет datagrid с ресурсом ViewSource, который обрабатывает презентацию. Но все это изменяется (кажется) с использованием привязки ObservableCollection. Поскольку я действительно не понимаю, как все это работает в модели, которую я получил, я не совсем уверен, как даже рассказать о моих вопросах. Поэтому я буду продолжать читать и экспериментировать. Спасибо за помощь :) –
@PaulGibson Я бы очень рекомендовал учиться использовать шаблон MVVM с самого начала. Он хорошо подходит для WPF и делает жизнь намного проще. Также, если вам интересно, мне нравится вести блог о WPF для новичков, и вы можете найти резюме новых сообщений в этом ответе, если хотите: [Переход из Windows Forms в WPF] (http://stackoverflow.com/a/15684569/302677) – Rachel