0

テーブル名を使用して、データベースからテーブルを取得できる関数を作成しようとしています。DataTable を使用して動作させましたが、WPF の DataGrid でグループ化の可能性を使用するために ListCollectionView で使用できるため、ObservableCollection/List を使用することをお勧めします。

ただし、 DataManager クラスで作成した関数が、テーブルに対応するさまざまな型のコレクションを返す必要があるという問題に直面しています。作成時に型が定義される ObservableCollection/List を定義するにはどうすればよいですか?

関数の例(これは機能しませんが、私がやろうとしていることを説明するかもしれません):

...
    public ObservableCollection<object> GetTable(string name)
    {
        ObservableCollection<object> table = null;

        switch (name)
        {
            case "PriceList":
                table = new ObservableCollection<PriceItem>();
                //Business logic
                break;
            case "CustomerTable":
                table = new ObservableCollection<Customer>();
                //Business logic
                break;
        }

        return table;
    }
...

または多分

...
    public ObservableCollection<object> GetTable(string name)
    {
        ObservableCollection<object> table;

        switch (name)
        {
            case "PriceList":
                table = getPriceList();
                break;
            case "CustomerTable":
                table = getCustomers();
                break;
        }

        return table;
    }

    private ObservableCollection<PriceItem> getPriceList()
    {
        ObservableCollection<PriceItem> table = null;

        //Bussiness logic

        return table;
    }
...

DRAFT OF MODIFIED METHOD (私はこれがおそらく完全に間違っていることを知っています):

    public ObservableCollection<T> GetTable<T>()
    {
        ObservableCollection<T> table = new ObservableCollection<T>();

        switch (typeof(T))
        {
            case "FarrisSeries":
                table = new ObservableCollection<FarrisSeries>();
                //Business logic
                break;
            case "FarrisSpecs":
                table = new ObservableCollection<object>();
                //Business logic
                break;
        }

        return table;
    }

考えられるユースケース(おそらくこれはすべて間違っていましたが、それでも試してみました:P)

Situation
---------

Window consists of MenuBar and a DataGrid. 
In the menu there is a DropDownButton containing 
a menu which contains a list of all table names.
Clicking any button will trigger a command that 
will load the table into the DataGrid using the
MenuItem Header as a parameter. The command will
then load the appropriate ObservableCollection
(containing Objects of type related to table name)
into the DataGrid.


Case 1:

 - User Clicks "PriceList"
 - function LoadTable("PriceList") is called
 - function retrieves PriceItems from the database
 - function returns ObservableCollection<PriceItem>
 - return is stored in the Object bound to the DataGrid

Case 2:

 - User Clicks "Customer"
 - function LoadTable("Customers") is called
 - function retrieves Customers from the database
 - function returns ObservableCollection<Customer>
 - return is stored in the Object bound to the DataGrid
4

2 に答える 2

4

次の 2 つのオプションが思い浮かびます。

  • の代わりに非ジェネリックIList型を返しObservableCollection<>ます。実際の型がObservableCollection<>変化を観察できるようにバインディングが機能することを期待しています。
  • メソッドをジェネリックにし、name パラメーターを完全に取り除きます。型引数に基づいて取得するコレクションを作成します。(これは、おそらく真に汎用的ではないため、私にはやや醜いように感じます-使用できる型のセットが限られているでしょう.)
于 2013-05-30T09:42:29.517 に答える
1

テーブル名を使用して、データベースからテーブルを取得できる関数を作成しようとしています。DataTable を使用して動作させましたが、WPF の DataGrid でグループ化の可能性を使用するために ListCollectionView で使用できるため、ObservableCollection/List を使用することをお勧めします。

これに答えるために、サンプルを作成しました。見てみな。これにはNorthwind dbを使用しています。これにより、顧客のデータテーブルが DataGrid にロードされ、オンザフライでグループ化されます。

これを使用するには、データベースからテーブル名に基づいてテーブルを呼び出すだけで、このテーブルの結果を itemsource として Datagrid に渡してグループ化を取得し、グループ化名を指定するテキスト ボックスを作成します。フォーカスが失われると、グループ化がデータグリッドに反映されます。これを試してみて、質問があれば教えてください。

<Window x:Class="TempTest.DataTableTest"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DataTableTest"
        Width="548"
        Height="292">
    <Window.Resources>
        <Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GroupItem}">
                        <Expander x:Name="exp"
                                  Background="White"
                                  Foreground="Black"
                                  IsExpanded="True">
                            <Expander.Header>
                                <TextBlock Text="{Binding Job Title}" />
                            </Expander.Header>
                            <ItemsPresenter />
                        </Expander>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50" />
            <RowDefinition Height="210*" />
        </Grid.RowDefinitions>
        <DataGrid Name="dataGrid1"
                  Grid.Row="1"
                  AutoGenerateColumns="true">
            <DataGrid.GroupStyle>
                <GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}">
                    <GroupStyle.Panel>
                        <ItemsPanelTemplate>
                            <DataGridRowsPresenter />
                        </ItemsPanelTemplate>
                    </GroupStyle.Panel>
                </GroupStyle>
            </DataGrid.GroupStyle>
        </DataGrid>
        <Button Name="button1"
                Width="56"
                Height="25"
                Margin="458,9,0,0"
                HorizontalAlignment="Left"
                VerticalAlignment="Top"
                Click="button1_Click"
                Content="Button" />
        <TextBox Name="textBox1"
                 Width="123"
                 Height="24"
                 Margin="18,10,0,0"
                 HorizontalAlignment="Left"
                 VerticalAlignment="Top" />
        <TextBox Name="textBox2"
                 Width="123"
                 Height="24"
                 Margin="147,10,0,0"
                 HorizontalAlignment="Left"
                 VerticalAlignment="Top" />
    </Grid>
</Window>

このためのコードビハインド。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using System.ComponentModel;

namespace TempTest
{
    /// <summary>
    /// Interaction logic for DataTableTest.xaml
    /// </summary>
    public partial class DataTableTest : Window
    {
        public DataTableTest()
        {
            InitializeComponent();
            textBox2.LostFocus += new RoutedEventHandler(textBox2_LostFocus);
        }

        void textBox2_LostFocus(object sender, RoutedEventArgs e)
        {
            if (!string.IsNullOrWhiteSpace(textBox2.Text))
            {
                var cv = dataGrid1.ItemsSource as CollectionView;
                if (cv != null)
                {
                    cv.GroupDescriptions.Clear();
                    cv.GroupDescriptions.Add(new PropertyGroupDescription(textBox2.Text));
                }

            }
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {

            DataTable dt = new DataTable();


            if (textBox1.Text.Equals("customers", StringComparison.InvariantCultureIgnoreCase))
            {
                Data.Northwind_2007DataSetTableAdapters.CustomersTableAdapter c = new Data.Northwind_2007DataSetTableAdapters.CustomersTableAdapter();
                dt = c.GetData();
            }
            else if (textBox1.Text.Equals("employees", StringComparison.InvariantCultureIgnoreCase))
            {
                Data.Northwind_2007DataSetTableAdapters.EmployeesTableAdapter emp = new Data.Northwind_2007DataSetTableAdapters.EmployeesTableAdapter();
                dt = emp.GetData();
            }


            dataGrid1.ItemsSource = (CollectionView)CollectionViewSource.GetDefaultView(dt.DefaultView);

        }
    }
}
于 2013-05-30T11:11:04.133 に答える