2012-02-13 113 views
2

我有很多我的小程序的分類項目列表。如何根據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

回答

4

如果項目數量沒有達到成千上萬,如果讓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