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

时间:2012-02-13 07:51:52

标签: c# .net wpf

我的小程序有很多分类项目。

我们假设我有一个名为 Candy 的类别,而Candy类别中有超过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个按钮。

我在这里太困惑了。请帮助我找到更好的解决方案。

1 个答案:

答案 0 :(得分:4)

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

此外,查看示例代码,您似乎打算在“while”循环内动态创建按钮。同样,虽然这是可能的方式,但这不是“教科书”解决方案或基于集合创建多个项目的简单解决方案。合适的范例是使用数据绑定到项目数组。

以下是一个例子:

在您的XAML文件中,定义< ItemsControl>。给它一个名字(比如ButtonsPanel),这样你就可以从后面的代码中引用它。在后面的代码中准备一个数组(或者List,或者从IEnumerable派生的任何东西)和你想要呈现的所有项目,并将元素的ItemsSource设置为这个列表。

ItemsControl是一个非常通用的Items Control。您可以定义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>

编辑(来自user995387的评论):
使用Prev / Next按钮(a.k.a. paging),数据绑定也是首选范例。在您的控件(或后面的代码)的数据上下文中有一个ObservableCollection,其中包含您要呈现的10个项目。单击“下一步”按钮,或者替换整个集合,或者集合中的10个项目(清除和10个添加),或者集合中项目的内容(在这种情况下,项目必须触发INotifyPropertyChanged事件) - 对你来说更有意义。仅当创建10个新按钮(而不是更新每个按钮的内容)时才会选择最后一个选项,从而降低性能。