如何根据WPF中的数据库查询创建按钮

问题描述:

我有很多我的小程序的分类项目列表。如何根据WPF中的数据库查询创建按钮

让我们假设我有一个名为糖果类别,并有100余项在类别糖果

在这里,我通过查询它,

OleDbConnection dbConnect = new OleDBConnection("...."); 
dbConnect.Open(); 
string query = "SELECT ID, item FROM Items WHERE category == 'Candy'"; 
OleDBCommand executeCommand= new OleDBCommand(query, dbConnect); 
OleDBDataReader reader = executeCommand.ExecuteReader(); 

结果可能是很多行,每一行都会有一个按钮的属性。一个新的按钮将被生成。

while(reader.Read()) { 
// create multiple buttons for each row here.. 
} 

现在的问题是,我想显示它在一个有限的高度和宽度的WrapPanel。 假设我只能在WrapPanel中显示10个按钮。但是,创建的按钮超过了50个。

解决此问题的最佳方法是什么?我想如果我可以修改查询10行,并创建10个按钮和另一个按钮与NEXT箭头将获取另外10个按钮。

我太困惑了。请帮助我提供更好的解决方案。

+0

为什么不使用组合框或列表框,它看起来比它更适合您的需要,比无限的按钮... – SvenG 2012-02-13 08:37:28

+0

@SvenG:我想这个界面触摸屏友好.. – user995387 2012-02-16 05:19:31

如果项目数量没有达到成千上万,如果让WPF为您管理视图,我认为您会更好(代码更少,代码更简单)。计划用户如何浏览按钮?它是一个滚动条吗?

另外,看看你的示例代码,看起来你打算在'while'循环内快速创建按钮。再次,虽然这是可能的方式,但这不是“教科书”解决方案或用于基于集合创建多个项目的简单解决方案。适合的范例是使用数据绑定到项目数组。

下面是一个例子:

在你的XAML文件中,定义一个<的ItemsControl >。给它一个名字(比如说ButtonsPanel),以便你可以从后面的代码中引用它。在后面的代码中,准备一个数组(或List,或从IEnumerable派生的任何东西),并将所有要显示的项目设置为该元素的ItemsSource。

ItemsControl是一个非常通用的项目控件。您可以定义ItemsPanel(即包含所有项目的面板)以及所有按钮的模板。

<ItemsControl x:Name="ButtonsPanel" Height="80" Width="50"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel>   
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Button Content="{Binding}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate>  
</ItemsControl> 

EDIT(以下从user995387评语):
随着上一个/下一个按钮(也称为寻呼)数据绑定也是优选的范例。在你的控件的数据上下文(或者后面的代码)中有一个ObservableCollection和你想要呈现的10个项目。单击“下一步”按钮,可以替换整个集合或集合中的10个项目(清除和10个添加)或集合中项目的内容(在这种情况下,该项目必须触发INotifyPropertyChanged事件) - 哪一个对你更有意义。只有在创建10个新按钮(而不是更新每个按钮的内容)时才会选择最后一个选项,这会影响性能。

+0

“带有下一个箭头的按钮将获取另外10个按钮。” 你的建议很有价值。 – user995387 2012-02-13 10:19:28

+0

如果我更喜欢滚动条,我该如何添加它? – user995387 2012-02-16 06:53:02

+0

@ user995387 - 如果您想拥有一个滚动条,您可以使用VerticalScrollBarVisibility =“Auto”将包装面板嵌入ScrollViewer元素中。不过,你最好忽略WrapPanel,只使用List(它有一个内置的滚动条)。 – Uri 2012-02-16 07:00:58