我创建了一个需要在我的 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
将评估为 true
和 Print
代码将运行。
但是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/