首页 > 解决方案 > WPF将新行添加到数据库中的填充数据表

问题描述

所以我正在使用 wpf .net 框架进行学校项目。

我有一个包含列的数据库:id、name、date、startTime、endTime、host。

在我的软件中,我想将这些值添加到数据表中。使用 MysqlDataAdapter 并填充数据表。

但是现在在添加了所有这些值之后,我想以编程方式添加一个名为 TotalTime 的新列,该列的行值为 (endTime - startTime) * 60 以分钟为单位计算总时间。

我认为在数据库中添加此列是多余的,所以这就是我通过代码添加它的原因。

但是我面临的问题是,当我填充数据表并尝试将 NewRow 添加到列中时,行会将其添加到新行中,而不是将其添加到填充数据的第一行中。

如何在第 1 行将 NewRow 添加到此数据网格,而不是像图像一样创建新的空行。

先感谢您!

查看数据网格问题的图像

填充数据表的代码:

public void GetProgrammaOverzicht(int zenderId)
    {
        try
        {
            Programmas.programmaDataTable.Clear();
            var query = $"SELECT naam, datum, begin_tijd, eind_tijd, presentator FROM programmas WHERE zenderId={zenderId}";

            ConnectionVariables.conn.Open();

            using (MySqlCommand cmdSel = new MySqlCommand(query, ConnectionVariables.conn))
            {
                MySqlDataAdapter da = new MySqlDataAdapter(cmdSel);
                da.Fill(Programmas.programmaDataTable);
            }
            ConnectionVariables.conn.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            Console.WriteLine(ex.Message);
        }
    }

以及我添加新行的代码+计算从数据库获取数据

public void CalculateTotalTime(int zenderId)
        {
            try
            {
                Programmas.beginTijd.Clear();
                Programmas.eindTijd.Clear();
            var query = $"SELECT begin_tijd, eind_tijd FROM programmas WHERE zenderId={zenderId}";

            var cmd = new MySqlCommand(query, ConnectionVariables.conn);
            ConnectionVariables.conn.Open();
            var queryresult = cmd.ExecuteReader();
            if (queryresult.HasRows)
            {
                while (queryresult.Read())
                {
                    Programmas.beginTijd.Add(queryresult.GetString(0));
                    Programmas.eindTijd.Add(queryresult.GetString(1));
                }
            }
            else
            {
                MessageBox.Show("Kan duur in minuten niet berekenen");
            }
            queryresult.Close();
            ConnectionVariables.conn.Close();
        }
        catch (Exception ex)
        {
            ConnectionVariables.conn.Close();
            MessageBox.Show(ex.Message);
            Console.WriteLine(ex.Message);
        }
    }

private void OpenProgrammaOverzichtBtn(object sender, RoutedEventArgs e)
    {
        int currentZenderId;
        string currentZender;
        currentZender = this.Name.Remove(0, 6);
        currentZenderId = Int32.Parse(currentZender);

        ProgrammaOverzichtDialog.IsOpen = true;
        zenderClass.GetProgrammaOverzicht(currentZenderId);
        zenderClass.CalculateTotalTime(currentZenderId);
        if (Programmas.programmaDataTable.Columns.Contains("Duur in minuten"))
        {
            Console.WriteLine("Column duur in minuten bestaat al");
        }
        else
        {
            DataColumn column = new DataColumn();
            column.ColumnName = "Duur in minuten";
            Programmas.programmaDataTable.Columns.Add(column);
        }
        DataRow row;
        for (int i = 0; i < Programmas.beginTijd.Count; i++)
        {
            string eind = Programmas.eindTijd[i];
            int eindTijd = int.Parse(eind.Remove(2, 3));
            string begin = Programmas.beginTijd[i];
            int beginTijd = int.Parse(begin.Remove(2, 3));
            int totaal = (eindTijd - beginTijd) * 60;
            row = Programmas.programmaDataTable.NewRow();
            row["Duur in minuten"] = totaal;
            Programmas.programmaDataTable.Rows.InsertAt(row, i);
        }
        programmaOverzichtGrid.DataContext = Programmas.programmaDataTable;
    }
}

以及按钮所在的xaml打开DATAGRID

<materialDesign:DialogHost Name="ProgrammaOverzichtDialog" Background="#FF3F3F46">
                    <materialDesign:DialogHost.DialogContent >
                        <StackPanel>
                            <DataGrid x:Name="programmaOverzichtGrid" AutoGenerateColumns="True" ItemsSource="{Binding}"/>
                        </StackPanel>
                    </materialDesign:DialogHost.DialogContent>
                    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
                        <Button FontSize="20px" Foreground="White" Content="programmaoverzicht" Click="OpenProgrammaOverzichtBtn" x:Name="programmaOverzichtBtn"/>
                    </StackPanel>
                </materialDesign:DialogHost>

标签: c#mysqlwpfxaml

解决方案


好吧,我认识的一个程序员同事给了我一个尝试的选项,它奏效了!

答:在我的方法“OpenProgrammaOverzichtBtn”中,我需要从

        row = Programmas.programmaDataTable.NewRow();
        row["Duur in minuten"] = totaal;
        Programmas.programmaDataTable.Rows.InsertAt(row, i);

至:

        row = Programmas.programmaDataTable.Rows[i];
        row["Duur in minuten"] = totaal;
        //Programmas.programmaDataTable.Rows.InsertAt(row, i);

推荐阅读