首页 > 解决方案 > 多个数据网格在 WPF 应用程序中,但一次只显示一个

问题描述

我创建了一个程序,需要在我的 WPF 应用程序底部显示 5 个数据网格,但是该程序一次只会显示一个。或者它将显示 3 个框,但只有一个 Datagrid 将包含任何数据。

这是我到目前为止的代码:

private void SearchButton_Click(object sender, RoutedEventArgs e)
    {

        if (GPBox.IsChecked == true)
        {
            connect = new MySqlConnection(connectionString);
            cmd = new MySqlCommand("select distinct nameOfService as Surgeries, street, city, postcode, contactNumber from gpSurgery", connect);
            connect.Open();
            DataTable dt = new DataTable();
            dt.Load(cmd.ExecuteReader());
            connect.Close();
            DataGridGP.Visibility = Visibility.Visible;
            DataGridGP.DataContext = dt;
        }  

        else if (DentistBox.IsChecked == true)
        {
            connect = new MySqlConnection(connectionString);
            cmd = new MySqlCommand("select distinct nameOfService as Dentists, street, city, postcode, contactNumber from Dentist", connect);
            connect.Open();
            DataTable dt = new DataTable();
            dt.Load(cmd.ExecuteReader());
            connect.Close();
            DataGridDentist.Visibility = Visibility.Visible;
            DataGridDentist.DataContext = dt;

        }
        else if (SchoolsBox.IsChecked == true)
        {
            connect = new MySqlConnection(connectionString);
            cmd = new MySqlCommand("select distinct nameOfService as Schools, street, city, postcode, contactNumber from Schools", connect);
            connect.Open();
            DataTable dt = new DataTable();
            dt.Load(cmd.ExecuteReader());
            connect.Close();
            DataGridSchools.Visibility = Visibility.Visible;
            DataGridSchools.DataContext = dt;

        }
        else if (NurseryBox.IsChecked == true)
        {
            connect = new MySqlConnection(connectionString);
            cmd = new MySqlCommand("select distinct nameOfService as Nurserys, street, city, postcode, contactNumber from Nursery", connect);
            MySqlDataAdapter sqlDA = new MySqlDataAdapter();
            DataTable dt = new DataTable();
            dt.Load(cmd.ExecuteReader());
            connect.Close();
            DataGridNursery.Visibility = Visibility.Visible;
            DataGridNursery.DataContext = dt;
        }

        else if (OpticianBox.IsChecked == true)
        {
            connect = new MySqlConnection(connectionString);
            cmd = new MySqlCommand("select distinct nameOfService as Opticians, street, city, postcode, contactNumber from Opticians", connect);
            MySqlDataAdapter sqlDA = new MySqlDataAdapter();
            DataTable dt = new DataTable();
            dt.Load(cmd.ExecuteReader());
            connect.Close();
            DataGridOpticians.Visibility = Visibility.Visible;
            DataGridOpticians.DataContext = dt;
        }
        else
        {
            MessageBox.Show("Select a service.");
        }

    }

XAML 代码:

<DataGrid Name="DataGridGP" Height="57" VerticalAlignment="Top" Margin="0,129,10,0" ItemsSource="{Binding}" Visibility="Collapsed"  />
    <DataGrid Name="DataGridDentist" HorizontalAlignment="Left" Height="57" Margin="0,191,0,0" VerticalAlignment="Top" Width="782" Visibility="Collapsed"/>
    <DataGrid Name="DataGridSchools" HorizontalAlignment="Left" Height="57" Margin="0,253,0,0" VerticalAlignment="Top" Width="782" Visibility="Collapsed"/>
    <DataGrid Name="DataGridNursery" Height="57" Margin="0,315,10,0" VerticalAlignment="Top" Visibility="Collapsed"/>
    <DataGrid Name="DataGridOpticians" HorizontalAlignment="Left" Height="57" Margin="0,377,0,0" VerticalAlignment="Top" Width="782" Visibility="Collapsed"/>

谁能明白为什么它只显示一个 Datagrid 或根本不显示?

谢谢

标签: c#wpfdatagrid

解决方案


问题似乎出在您的 c# 代码中。您else if在每个条件中都使用,这意味着该块中的代码只有在没有满足之前的条件时才会运行。例如:

void test()
{
    int i = 5;

    if (i < 2)
    {
        System.Diagnostics.Debug.Print("< 2");
    }
    else if (i > 2)
    {
        System.Diagnostics.Debug.Print("> 2");
    }
    else if(i == 5)
    {
        System.Diagnostics.Debug.Print("= 5");
    }
}

在上面,i < 2将评估为false
i > 2将评估为true并且Print代码将运行。
但是i == 5永远不会被检查,因为我们已经找到了我们的匹配项。

在您的代码中,如果您希望用户能够检查多个框并DataGrid加载每个框,那么您需要将else ifs 替换为普通ifs。

代码冗余注意事项

通常,您应该避免使用许多不同版本的非常相似的代码,就像您的代码一样。在每个if块中,您运行的代码几乎相同。如果您需要更改它,则必须更改 5 次。

相反,您应该使用一个方法并将所需的变量传递给它,如下所示:

void loadDataGrid(string command, DataGrid dataGrid)
{
    connect = new MySqlConnection(connectionString);
    cmd = new MySqlCommand(command, connect);
    MySqlDataAdapter sqlDA = new MySqlDataAdapter();
    DataTable dt = new DataTable();
    dt.Load(cmd.ExecuteReader());
    connect.Close();
    dataGrid.Visibility = Visibility.Visible;
    dataGrid.DataContext = dt;
}

你的SearchButton_Click然后变成:

private void SearchButton_Click(object sender, RoutedEventArgs e)
{

    if (GPBox.IsChecked == true)
    {
        loadDataGrid("select distinct nameOfService as Surgeries, street, city, postcode, contactNumber from gpSurgery", DataGridGP)
    }

    ...
}

每个if条件现在只有一行代码,而不是八行。

WPF 布局注意事项

一般来说,您不应该使用固定Margin值来相对于彼此定位 WPF 元素。这开始违背 WPF 布局系统的目的,它使您可以构建非常灵活的设计。相反,您将使用各种类型的Panel.

对于您的情况,我可能会推荐一个 'StackPanel , since you want to stack yourDataGrid`s 垂直叠加。


推荐阅读