c# - 多个数据网格在 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# 代码中。您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 if
s 替换为普通if
s。
代码冗余注意事项
通常,您应该避免使用许多不同版本的非常相似的代码,就像您的代码一样。在每个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 your
DataGrid`s 垂直叠加。
推荐阅读
- java - 加载一个 txt 文件 -> 打开失败:ENOENT(没有这样的文件或目录)。我很确定问题不在于路径,但我找不到错误
- javascript - 如何在 GraphQL (Relay) 中查询和改变数组类型?
- javascript - 1 个 onclick 事件的 3 个函数
- git - git stash 在跳过工作树后找不到更改但无法签出到新分支
- installation - 安装 JFrog Artifactory 时出现路由器服务错误
- c# - C# get 和 set 与手动编写的 GetSomeValue() 和 SetSomeValue(value) 方法之间的区别?
- sql-server - 如果 RCSI 下不存在则插入
- python - 如何使用 Python 将文本文件复制并粘贴到指定的 Excel TAB 中?
- asp.net - 我的购物车项目的 da.Fill(ds) 命令出错
- dataframe - 从头开始设置特定的多索引