-4

わかった。数時間考えた後、前の質問の回答からいくつかのガイダンスがあったにもかかわらず、うまくいかなかったので、もう一度質問することにしました。これが私の元の質問です

現在、販売時点管理システムを作成しており、ProductType に応じて TabControl - TabPages のボタンとしてデータベースに製品を動的に表示したいと考えています。しかし、問題は、これらの製品をボタンとして TabPages に取得できますが、以下のようにすべての TabPage に同じ製品リストが表示されるため、ProductType に従って各 TabPage に並べ替えることができないことです。

ここに画像の説明を入力

そして、これが私のデータベースです。

ここに画像の説明を入力

private void CreateTabPages() // Create Tab Pages for each ProductType
        {
            con.Open();
            SqlDataAdapter sda = new SqlDataAdapter("SELECT DISTINCT ProductType, Description FROM TblProductType", con);
            DataTable dt = new DataTable();
            sda.Fill(dt);

            foreach (DataRow dr in dt.Rows)
            {
                tabControl1.TabPages.Add(dr["ProductType"].ToString(),dr["Description"].ToString());
            }

            con.Close();   
        }


    private void AddProductsToTabbedPanel() // Add Products to Tab Pages
{

    foreach (TabPage tp in tabControl1.TabPages)
    {
        con.Open();
        SqlDataAdapter sda = new SqlDataAdapter("SELECT DISTINCT Description FROM TblProduct", con);
        DataTable dt = new DataTable();
        sda.Fill(dt);

        FlowLayoutPanel flp = new FlowLayoutPanel();
        flp.Dock = DockStyle.Fill;

        foreach (DataRow dr in dt.Rows)
        {
            Button b = new Button();
            b.Size = new Size(100, 100);
            b.Text = dr["Description"].ToString(); 
            flp.Controls.Add(b);
        }

        tp.Controls.Add(flp);
        con.Close();
    }


}

これについてフィードバックをいただければ幸いです。

4

1 に答える 1

1

免責事項: はい、OP の写真に WinForms が表示されていることは知っていますが、他の質問では、OP は のチュートリアルに従っていると述べていますYouTube。私は、彼が WPF を使用して同じデータを表現できる別の方法を提供したいと考えました。

;を処理する代わりに、を使用しModelてそれぞれの を表示できます。Object-Relational Mapping、Entity-Framework、NHibernate などをご覧ください。DataTypesRaw Data

Productテーブルからのデータを保持するモデルを作成しProductます。

public class Product {
    public int ProductID {get;set;}
    public int ProductType { get; set; }
    public string Description { get; set; }
    public double Price { get; set; }
    public byte[] Image { get; set; }
}

Product Typeテーブルからのデータを保持するモデルを作成しProduct Typeます。

public class ProductType {
    public int ProductTypeID { get; set; }
    public string Description { get; set; }
}

を保持するWindow/を作成します。UserControlTabControl

<Window.Resources>
    <local:ProductConverter x:Key="ProductConverter" />
    <local:ProductTypeConverter x:Key="ProductTypeConverter" />
</Window.Resources>
<TabControl ItemsSource="{Binding MyProducts, 
            Converter={StaticResource ProductConverter}}">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock>
                    <TextBlock.Text>
                        <MultiBinding Converter="{StaticResource ProductTypeConverter}">
                            <Binding Path="ProductType"/>
                            <Binding Path="DataContext.MyProductTypes" 
                                     RelativeSource="{RelativeSource AncestorType={x:Type Window}}"/>
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <ListBox ItemsSource="{Binding}">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <Button Width="150" Content="{Binding Description}"/>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>

ItemTemplateandを使用するとContentTemplate、すべてのProductオブジェクトが同じ形式とスタイルを持つようになります。

これは、値に基づいて のリスト全体を のProductsグループに変換するコンバータです。ProductsProduct Type

public class ProductConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        if(value as List<Product> != null) {
            return (value as List<Product>).GroupBy(a => new { a.ProductType });
        }

        return null;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        return null;
    }
}

これは、Product.ProductType値をProductType.Description

public class ProductTypeConverter : IMultiValueConverter {
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) {
        if(values[0] != null && values[0] != DependencyProperty.UnsetValue &&
            values[1] != null && values[1] != DependencyProperty.UnsetValue) {
            string f= (values[1] as List<ProductType>)
                      .Where(a => a.ProductTypeID.Equals(values[0]))
                      .First().Description;
            return f;
        }

        return false;
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) {
        return null;
    }
}

の表示に使用するプロパティを作成しますTabControl.Items

public List<Product> MyProducts { get; set; }
public List<ProductType> MyProductTypes { get; set; }

あとはRaw Data、モデル形式で表現するだけです。(私のSQLは少し不安定です)

    SqlCommand sqlCmdProducts = new SqlCommand("SELECT * FROM TblProduct", myConnection);
SqlDataReader productReader = sqlCmdProducts.ExecuteReader();
while (productReader.Read()) {
    MyProductTypes.Add(new ProductType() {
    ProductTypeID = Int32.Parse(productReader["ProductType"].ToString()),
    Description = Int32.Parse(productReader["Description"].ToString()),
    };
}

SqlCommand sqlCmdProductType = new SqlCommand("SELECT * FROM TblProductType", myConnection);
SqlDataReader productTypeReader = sqlCmdProductType.ExecuteReader();
while (productTypeReader.Read()) {
    MyProducts.Add(new Product() {
    ProductID = Int32.Parse(productTypeReader["ProductID"].ToString()),
    ProductType = Int32.Parse(productTypeReader["ProductType"].ToString()),
    Description = productTypeReader["Description"].ToString()),
    Price = double.Parse(productTypeReader["Price"].ToString()),
    };
}
于 2013-08-15T18:14:35.553 に答える