2012-02-13 11 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 arrowは別の10個のボタンをフェッチします。

私はここであまりにも混乱しています。より良い解決策で私を助けてください。

+0

ComboBoxまたはListBoxを使用しないと、ボタンのミラードよりもニーズに合ったように見えます。 – SvenG

+0

@SvenG:このインターフェースのタッチスクリーンは使いやすくなりました。 – user995387

答えて

4

アイテム数が数千に達しない場合は、WPFでビューを管理できるようにすると、コードをずっと小さく(コードはずっと少なくて済むように)改善できます。ユーザーがボタンをブラウズするように計画するにはどうすればよいですか?スクロールバーですか?

また、サンプルコードを見ると、whileループ内でオンザフライでボタンを作成するように見えます。繰り返しますが、これは可能な方法ですが、これはコレクションに基づいて複数のアイテムを作成するための「教科書」ソリューションまたは単純なソリューションではありません。適切なパラダイムは、アイテムの配列に対するデータバインディングを使用しています。ここで

は一例です:

あなたのXAMLファイル内で、<のItemsControl >を定義します。それはあなたのコードの後ろからそれを参照することができるように名前(ButtonsPanelと言う)を与えます。コードの背後に、表示するすべての項目を含む配列(またはList、またはIEnumerableから派生したもの)を準備し、要素のItemsSourceをこのリストに設定します。

ItemsControlは非常に汎用的なItemsコントロールです。 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から次のコメント):前/次へボタン(別名ページング)で
データバインディングも好ましいパラダイムです。コントロール(またはコードビハインド)のデータコンテキスト内には、提示したい10個のアイテムを含むObservableCollectionがあります。 「次へ」ボタンをクリックすると、コレクション全体、またはコレクション内の10個のアイテム(クリアと10個の追加)、またはコレクション内のアイテムのコンテンツを置き換えます(この場合、アイテムはINotifyPropertyChangedを起動する必要があります)イベント) - いずれにしてもあなたにとって理にかなっています。最後のオプションを選択するのは、10個の新しいボタンを作成する場合(各ボタンの内容を更新するのではなく)にはパフォーマンス上のペナルティがあります。

+0

"NEXT矢印のあるボタンは別の10個のボタンをフェッチします。" あなたのアドバイスは貴重でした。 – user995387

+0

もし私がスクロールバーを好むなら、どうすればそれに追加できますか? – user995387

+0

@ user995387 - スクロールバーを使用する場合は、VerticalScrollBarVisibility = "Auto"のScrollViewer要素内にラップパネルを埋め込むことができます。ただし、WrapPanelを一切無視して、リスト(スクロールバーが組み込まれています)を使用する方が良いでしょう。 – Uri

関連する問題