как обновить базу данных через tableadpater в WPF?

#c# #wpf

#c# #wpf

Вопрос:

в deigner я задаю команду обновления tableadapter следующим образом, после использования tableadpater update в событии button она не обновляется, как обновить в WPF?

Я добавил цикл для обновления набора данных вручную и обеспечения обновления набора данных с помощью messagebox.show однако после повторного использования dataadapter.update присваивания datacontext результат не меняется, означает, что база данных не обновляется

 UPDATE        Food
SET                  Home =@Home
WHERE Name=@Name


<local:Food_DataSet x:Key="Food_DataSet" />

    </Window.Resources>
    <Grid VerticalAlignment="Top" Height="300">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="150"/>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Menu Grid.Row="0" Height="20" VerticalAlignment="Top">
            <MenuItem Header="Archivo" Background="Wheat" Name="MenuItem1" >
                <MenuItem Name="mi1" Style="{StaticResource Triggers}"  Header="_Nuevo" />
                <MenuItem Name="mi2" Style="{StaticResource Triggers}"  Header="_Abrir" />
                <MenuItem Name="mi3" Style="{StaticResource Triggers}"  Header="_Salir"/>
            </MenuItem>
        </Menu>

        <ListView Grid.Row="1"
                  Name="listView"
                  Margin="5,5,5,5" 
                  ItemsSource="{Binding Mode=OneWay}" 
                  ItemContainerStyle="{DynamicResource myItemContainerStyle}"
                  ItemsPanel="{DynamicResource ItemsPanelTemplate1}" 
                  GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler">
            <ListView.View>
                <GridView>
                    <GridViewColumn DisplayMemberBinding="{Binding Name}" 
                                    Header="{Binding Path=Columns[Name], Converter={StaticResource columnHeaderConverter}}"/>
                    <GridViewColumn Header="{Binding Path=Columns[Home], Converter={StaticResource columnHeaderConverter}}">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <lib:EditBox
                                    BorderThickness="0"
                                    VerticalAlignment="Stretch"
                                    HorizontalAlignment="Stretch"
                                    Value="{Binding Home, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
...
private WordProcess.Food_DataSetTableAdapters.FoodTableAdapter foodTableAdapter;
        private WordProcess.Food_DataSet FoodDataSet;

        public Window1()
        {
            InitializeComponent();
            this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

            DataContext = (new FoodTableAdapter()).GetData();


            FoodDataSet = ((WordProcess.Food_DataSet)(this.FindResource("Food_DataSet")));
            foodTableAdapter = new WordProcess.Food_DataSetTableAdapters.FoodTableAdapter();
            //foodTableAdapter.Fill(FoodDataSet.Food);

        }
        private void word_button_Click(object sender, RoutedEventArgs e)
        {
                        MessageBoxResult objResult = MessageBox.Show("Are You sure You want to save", "Save Confirmation", MessageBoxButton.YesNo);
        if(objResult == MessageBoxResult.Yes)
        {

            for (int i = 0; i < FoodDataSet.Food.Count; i  )
            {
                for(int j=0; j<listView.Items.Count; j  )
                {
                    DataRowView Home = (DataRowView)listView.Items[j];
                    FoodDataSet.Food[i].Home = Home.Row[1].ToString();
                }
            }
            FoodDataSet.AcceptChanges();
            MessageBox.Show(FoodDataSet.Food[0].Home);
            try
            {
                foodTableAdapter.Update(FoodDataSet.Food);

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            DataContext = foodTableAdapter.GetData();
        }
  

Комментарии:

1. как обновить базу данных через tableadpater в WPF? это как сравнивать яблоки и груши. есть 2 вопроса: 1.my в наборе данных есть изменения, которые не сохраняются в базе данных через dataadapter.update(). 2.my набор данных не отражает изменения в пользовательском интерфейсе wpf или наоборот. пожалуйста, укажите вашу проблему

2. Что обычно делается при привязке listview к базе данных, которая может сохраняться в базе данных?

Ответ №1:

Это не удивительно. В начале вы устанавливаете: FoodDataSet.AcceptChanges(); «Когда вы вызываете AcceptChanges для набора данных, все объекты DataRow, все еще находящиеся в режиме редактирования, успешно завершают свои изменения. Свойство RowState каждого DataRow также изменяется; Добавленные и измененные строки становятся неизменными, а удаленные строки удаляются.»

И затем вы пытаетесь: foodTableAdapter.Обновление(FoodDataSet.Food); После AcceptChanges() сохранять в БД нечего.

Комментарии:

1. Что обычно делается при привязке listview к базе данных, которая может сохраняться в базе данных?

2. Уильям, если ты используешь WPF4 — используй DataGrid. По сути, ListView с GridView — это сетка данных для бедных.