WPF добавляет новую строку в заполненную таблицу данных из БД

Итак, я работаю над школьным проектом, используя структуру wpf .net.

У меня есть БД со столбцом: идентификатор, имя, дата, время начала, время окончания, хост.

И в моем программном обеспечении я хочу добавить эти значения в таблицу данных. который работал с использованием MysqlDataAdapter и заполнением таблицы данных.

но теперь, после добавления всех этих значений, я хочу программно добавить новый столбец с именем TotalTime, значения строки этого столбца (endTime — startTime) * 60 для расчета totalTime в минутах.

Я считаю излишним добавлять этот столбец в БД, поэтому я добавил его по коду.

Но проблема, с которой я сталкиваюсь, заключается в том, что когда я заполнил таблицу данных и попытался добавить NewRow в столбец, строки добавят ее в новую строку, а не добавят в первую строку заполненных данных.

Как я могу добавить NewRow в эту сетку данных в строке 1 вместо создания новых пустых строк, таких как изображения.

Заранее спасибо!

Посмотреть изображение проблемы с сеткой данных

Код для заполнения datatable:

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>

См. также:  Проверка входа с запросом базы данных на каждой странице
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Yeray

    Оке, мой знакомый программист дал мне возможность попробовать, и это сработало!

    Ответ: В моем методе «OpenProgrammaOverzichtBtn» мне нужно было перейти от

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

    To:

            row = Programmas.programmaDataTable.Rows[i];
            row["Duur in minuten"] = totaal;
            //Programmas.programmaDataTable.Rows.InsertAt(row, i);
    
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: