c# - 在 WPF DataGrid 中删除行和更改数据时遇到问题(使用 MySQL)

标签 c# mysql wpf

我正在尝试创建一个以数据网格为中心的 WPF 应用程序。我有以下 MySQL 表:

+-------------+-----------------+------+-----+---------+----------------+
| Field       | Type            | Null | Key | Default | Extra          |
+-------------+-----------------+------+-----+---------+----------------+
| id          | int(6) unsigned | NO   | PRI | NULL    | auto_increment |
| DQvalue     | varchar(255)    | YES  |     | NULL    |                |
| DQIndexOf   | varchar(255)    | YES  |     | NULL    |                |
| DIvalue     | varchar(255)    | YES  |     | NULL    |                |
| DIIndexOf   | varchar(255)    | YES  |     | NULL    |                |
| AQvalue     | varchar(255)    | YES  |     | NULL    |                |
| AQIndexOf   | varchar(255)    | YES  |     | NULL    |                |
| AIvalueLoHi | varchar(255)    | YES  |     | NULL    |                |
| AIIndexOf   | varchar(255)    | YES  |     | NULL    |                |
| description | text            | YES  |     | NULL    |                |
| checkBit    | tinyint(1)      | NO   |     | NULL    |                |
| GND1        | tinyint(1)      | NO   |     | NULL    |                |
| GND2        | tinyint(1)      | NO   |     | NULL    |                |
+-------------+-----------------+------+-----+---------+----------------+

这是 DataGrid XAML:

<DataGrid ItemsSource="{Binding Path=., Mode=TwoWay}" x:Name="receptenDg" AutoGeneratedColumns="resize_plugdatagrid" HorizontalAlignment="Left" Height="894" Margin="10,10,0,0" VerticalAlignment="Top" Width="1543" Grid.ColumnSpan="3">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Delete">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button x:Name="delete" Content="Delete" Click="Delete_Row"/>
                 </DataTemplate>
             </DataGridTemplateColumn.CellTemplate>
         </DataGridTemplateColumn>
     </DataGrid.Columns>
     <DataGrid.ColumnHeaderStyle>
         <Style TargetType="{x:Type DataGridColumnHeader}">
             <Setter Property="Background" Value="{StaticResource PrimaryBrush}"/>
             <Setter Property="Foreground" Value="{StaticResource PrimaryFont}" />
             <Setter Property="HorizontalContentAlignment" Value="Center" />
             <Setter Property="BorderThickness" Value="3"/>
             <Setter Property="BorderBrush" Value="Black"/>
         </Style>
     </DataGrid.ColumnHeaderStyle>
 </DataGrid>

我还创建了一个 Mysql 数据库类以在我的 WPF 应用程序中使用。

当我的 WPF 应用程序启动时,将初始化以下代码:

 DataContext = this;
 receptenDg.BeginInit();
 db.CreateTable();
 db.dt.Tables[0].RowDeleted += Row_Deleted;
 db.dt.Tables[0].RowChanged += Row_Changed;
 receptenDg.SetBinding(ItemsControl.ItemsSourceProperty, new Binding
 {
     Source = db.dt.Tables[0]
 });
 receptenDg.Items.Refresh();
 receptenDg.EndInit();

应用程序的这一部分工作正常。此代码使用 MySQL 数据库中的数据正确填充我的数据网格。 当我单击按钮时,我会打开第二个窗口。我输入一些信息,单击第二个窗口内的按钮,它会在我的 mysql 表中添加一个新行。然后它关闭我的第二个窗口。

关闭窗口后,我在数据库类中尝试了以下函数:

  ReceptenPopup recept = new ReceptenPopup();
  if (recept.ShowDialog() == true)
  {
  }
  else
  {
      receptenDg.BeginInit();
      db.Update();
      db.CreateTable();
      receptenDg.SetBinding(ItemsControl.ItemsSourceProperty, new Binding
      {
          Source = db.dt.Tables[0]
      });
      receptenDg.Items.Refresh();
      receptenDg.EndInit();
  }

else 语句中的代码调用我的数据库类中的以下函数(db 是对我的 MySQL 类的调用):

public DataSet dt;

public DataSet Update()
{
    MySqlCommandBuilder myBuilder = new MySqlCommandBuilder(adp);

    adp.Update(dt);
    return dt;
}

public DataSet CreateTable()
{
    string query = "Select * from Recepten";
    using(MySqlConnection conn0 = new MySqlConnection(connectionString))
    using(MySqlCommand cmd = new MySqlCommand(query, conn0))
    using(adp = new MySqlDataAdapter(cmd))
    {
        dt = new DataSet();
        adp.Fill(dt);
    }
    return dt;
}

虽然我现在可以向数据网格添加新行,但无法删除以前有效的行。这是我用来从数据网格中删除行的函数。

private void Delete_Row(object sender, RoutedEventArgs e)
{
    DataRowView row = (DataRowView)receptenDg.SelectedItem;
    db.dt.Tables[0].Rows.Remove(row.Row);
    //dt.Rows.Remove(row.Row);
    db.Update();
    receptenDg.Items.Refresh();
}

我之前还使用了以下已绑定(bind)到我的初始化代码的函数(请参阅上面的初始化代码)。我以前使用的是 DataTable,但后来改用了 DataSet,因为它不那么麻烦(个人而言)。

private void Row_Changed(object sender, DataRowChangeEventArgs e)
{
    updateDataGrid();
}

private void Row_Deleted(object sender, DataRowChangeEventArgs e)
{
    updateDataGrid();
}

private void updateDataGrid()
{
    receptenDg.BeginInit();
    db.Update();
    db.CreateTable();
    receptenDg.SetBinding(ItemsControl.ItemsSourceProperty, new Binding
    {
        Source = db.dt.Tables[0]
    });
    receptenDg.Items.Refresh();
    receptenDg.EndInit();
}

当我以前使用 DataTable 时,上面的功能非常有效,但我似乎无法让这些功能再次工作。

抱歉我的英语很糟糕。

最佳答案

我设法解决了我的问题。 我将以下内容添加到我的初始化代码中:

DataContext = this;
receptenDg.BeginInit();
db.CreateTable();
receptenDg.SetBinding(ItemsControl.ItemsSourceProperty, new Binding
{
Source = db.dt.Tables[0]

});
receptenDg.AutoGenerateColumns = true;
receptenDg.CanUserAddRows = false;
db.dt.Tables[0].RowChanged += new DataRowChangeEventHandler(Row_Changed);
db.dt.Tables[0].RowDeleted += new DataRowChangeEventHandler(Row_Deleted);
receptenDg.Items.Refresh();
receptenDg.EndInit();

请注意添加的 Row_Changed 和 RowDeleted。他们在数据网格内发生变化时调用以下函数:

    #region This function updates the datatable when a row has been altered in the datagrid.
    private void Row_Changed(object sender, DataRowChangeEventArgs e)
    {
        db.Update();
    }
    #endregion
    #region This function updates the datatable when a row has been deleted in the datagrid.
    private void Row_Deleted(object sender, DataRowChangeEventArgs e)
    {
        db.Update();
    }
    #endregion

//db.Update calls a function inside my MySQL Code, which looks like this:

public DataSet Update()
{
    string query = "Select * from Recepten";
    using (MySqlConnection cnn = new MySqlConnection(connectionString))
    using (MySqlCommand cmd4 = new MySqlCommand(query,cnn))
    using(adp = new MySqlDataAdapter(cmd4))
    using (MySqlCommandBuilder myBuilder = new MySqlCommandBuilder(adp))
    {
        cnn.Open();
        adp.Update(dt);
    }
    return dt;
}

关于c# - 在 WPF DataGrid 中删除行和更改数据时遇到问题(使用 MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53503469/

相关文章:

c# - Dictionary.Add 方法如何进行 O(1) 摊销?

c# - 当 gridview 在页面加载时加载时默认加载第二页

c# - 如何找出鼠标悬停在代码中创建的图片框?

php - 为什么 if 语句在此循环中不起作用? PHP

java - 使用PhP在android和mysql之间建立连接时出错

wpf - 如何在 WPF 中使 TextBox 可滚动

c# - WPF-使按钮的凹陷效果变慢

c# - ASP.NET MVC 路由不工作

c# - WPF 绑定(bind) - 标签绑定(bind)问题

php - 在MySQL多重插入中将数组值连接到字符串中