c# - WPF 应用程序中的多个数据网格,但一次只显示一个

标签 c# wpf datagrid

我创建了一个需要在我的 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# 代码中。您正在使用 else if在您的每个条件下,这意味着该 block 中的代码只有在不满足先前条件的情况下才会运行。 例如:

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将评估为 truePrint代码将运行。
但是i == 5永远不会被检查,因为我们已经找到了匹配项。

在您的代码中,如果您希望用户能够勾选多个框并让每个框都显示 DataGrid s 负载,那么您需要更换 else if s 正常 if

代码冗余注意事项

一般来说,您应该避免使用非常相似的代码的许多不同版本,就像您自己的代码一样。在每一个if block ,您正在运行的代码几乎相同。如果您需要更改它,则必须更改它 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 your DataGrid 彼此垂直重叠。

关于c# - WPF 应用程序中的多个数据网格,但一次只显示一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59177855/

相关文章:

Visual Basic 中的 C# - 如何从并行数组中添加整数?

c# - 如何返回用户在 PC 中使用的当前文化

wpf - 捕捉 SurfaceListBox

wpf - 当 DataGrid 元素分组时,会触发 ComboBox 的 SelectionChanged

c# - 使用文本框过滤 WPF 数据网格

c# - 方法签名中的新关键字

C# TPL 每秒更新一次 Gridview

c# - 我希望能够使用 lambda 表达式来指定要通过 wcf 服务返回的值范围

c# - 如何创建一个在 WPF 中拖动时调整窗口大小的按钮?

WPF DataGrid,添加行时应用程序崩溃