WPF добавляет новую строку в заполненную таблицу данных из БД - PullRequest
0 голосов
/ 17 апреля 2020

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

У меня есть БД, в которой есть столбец: id, имя, дата, startTime, endTime, host.

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

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

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

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

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

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

See image of datagrid issue

Код для заполнения таблицы данных:

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>

1 Ответ

0 голосов
/ 17 апреля 2020

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

Ответ: В моем методе "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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...