0

現在、3 つのコンボボックスを含むリストビュー ボックスがあります。私はSQLデータベースからそれらを移入しています。行ごとに、2 番目のコンボボックスで選択した値に基づいて、3 番目のコンボボックスの内容を変更したいと考えています。

コンボボックスは次のようになります: cmbx1 (従業員 [ジャック、ジル、トム、リサ])、cmbx2 (製品 [ペン、鉛筆、ホッチキス])、cmbx3 (色 - 製品で利用可能な色に基づいて動的になります)

製品と色のオプション: ペン [赤、青、黒]; 鉛筆[黒、オレンジ、赤]; ホッチキス[ピンク、ティール、パープル、ブラウン]

Row1 でユーザーがペンを選択すると、その製品で使用可能な色のみがその行のカラー コンボボックスに表示されます。次の行には、選択した製品に基づいて異なる色のオプションが表示される場合があります。

これは可能ですか、それとも結果を達成するための別の方法を見つける必要がありますか?

これが現在持っているものです...

<ListView.View>
    <GridView>
        <GridViewColumn Header="Employee" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrEmployee}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Product" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrProduct}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Color" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrColor}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
</ListView.View>

コードビハインド

List<Int32> liEmployee = new List<Int32>();
List<string> lsEmployee = new List<string>();
List<Int32> liProduct = new List<Int32>();
List<string> lsProduct = new List<string>();
List<Int32> liColor = new List<Int32>();
List<string> lsColor = new List<string>();

SqlConnection conn = new SqlConnection("Data Source=localhost\\SQLEXPRESS;Initial Catalog=testDB;Persist Security Info=True;User ID=USER;Password=PASSWORD;");//Connect Timeout=900
SqlCommand cmd1 = new SqlCommand("select id,employee from testDB.dbo.dmEmployee where inactive=0", conn);
SqlCommand cmd2 = new SqlCommand("select id,Product from testDB.dbo.tblProductList where inactive=0", conn);
SqlCommand cmd3 = new SqlCommand("select id,Color from testDB.dbo.Color where inactive=0", conn);

conn.Open();
SqlDataReader dr1 = cmd1.ExecuteReader();
while (dr1.Read())
{
    liEmployee.Add(dr1.GetInt32(dr1.GetOrdinal("id")));
    lsEmployee.Add(dr1.GetString(dr1.GetOrdinal("employee")));
}
conn.Close();
conn.Open();
SqlDataReader dr2 = cmd2.ExecuteReader();
while (dr2.Read())
{
    liProduct.Add(dr2.GetInt32(dr2.GetOrdinal("id")));
    lsProduct.Add(dr2.GetString(dr2.GetOrdinal("Product")));
}
conn.Close();
conn.Open();
SqlDataReader dr3 = cmd3.ExecuteReader();
while (dr3.Read())
{
    liColor.Add(dr3.GetInt32(dr3.GetOrdinal("id")));
    lsColor.Add(dr3.GetString(dr3.GetOrdinal("Color")));
}
conn.Close();


List<lvItem> itemFound = new List<lvItem>();
itemFound.Clear();
lvItem puzzlePieces;
for (int cnt = 0; cnt < 10; cnt++)
{
    puzzlePieces = new lvItem();

    puzzlePieces.lStrEmployee = lsEmployee;
    puzzlePieces.lStrDatabase = lsDatabase;
    puzzlePieces.lStrProvider = lsProvider;

    itemFound.Add(puzzlePieces);
}
list1.ItemsSource = itemFound;

ありがとう!

4

1 に答える 1

1

あなたの質問に対する回答が得られなかったことに驚いています。多分それは、あなたが WPF の方法で物事を行っていないように見えるからですか、それともあなたがあまりにも多くを求めているからですか?

INotifyPropertyChangedまず最初に、インターフェイスを実装し、 ListView. あなたの場合、3 つのコレクションと 3 つの選択された項目の値が必要です。例として、次のようなことができます (INotifyPropertyChangedインターフェースを自分で実装します):

public class RowData : INotifyPropertyChanged
{
    public ObservableCollection<Employee> Employees { get; set; }
    public Employee SelectedEmployee { get; set; }
    public ObservableCollection<Product> Products { get; set; }
    public Product SelectedProduct { get; set; }
    public ObservableCollection<Brush> Colours { get; set; }
    public Brush SelectedColour { get; set; }
}

構造体でBrushはなくクラスを使用していることに注意してください。これはクラスであるためです。これは、クラスにバインドできることを意味し、WPF で主に使用されているためです。ColorBrush

Coloursただし、行ごとに異なる可能性があるコレクションを除いて、すべての行のすべてのオブジェクトに同じコレクションを持つことは最適ではありません。そうは言っても、それはまさに私がやろうとしていることです。なぜなら、私が説明するのがより速くなり、後の段階でコードを自分で改善できるからです。

データ型クラスができたので、その型のプロパティを追加して、ListViewコントロールにバインドする必要があります。のコード ビハインドを使用している場合はMainWindow、そのための を作成しましょうDependencyProperty

public static readonly DependencyProperty RowDataProperty = DependencyProperty.
    Register("RowData", typeof(ObservableCollection<RowData>), typeof(MainWindow), 
    new UIPropertyMetadata(new ObservableCollection<RowData>()));

public ObservableCollection<RowData> RowData
{
    get { return (ObservableCollection<RowData>)GetValue(RowDataProperty); }
    set { SetValue(RowDataProperty, value); }
}

コレクションに入力したら、ListViewコントロールにバインドできます。

xmlns:Local="clr-namespace:YourWpfApplicationName"
...
<ListView ItemsSource="{Binding RowData, RelativeSource={RelativeSource AncestorType={
    x:Type Local:MainWindow}}}">
    ...
</ListView>

つまりRelativeSource Binding、コード ビハインドで定義したプロパティを探しているだけです。ComboBoxでは、 aがそれぞれに表示されるように定義するにはどうすればよいGridViewColumnでしょうか。以下を定義する必要がありますGridViewColumn.CellTemplate

<GridViewColumn Header="Employees">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding Employees}" SelectedItem="{Binding 
                SelectedEmployee}" />
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

この例の他の列を定義する必要があります。このパズルの最後の部分は、他のesColours ComboBoxの選択された値に依存するコンテンツを更新する方法ですか? ComboBox答えは、RowDataクラスで選択した値のプロパティにあります。

public Employee SelectedEmployee
{
    get { return selectedEmployee; }
    set
    {
        selectedEmployee = value;
        NotifyPropertyChanged(SelectedEmployee);
        Colours = GetColours();
    }
}

private ObservableCollection<Brush> GetColours()
{
    ObservableCollection<Brush> newColours = new ObservableCollection<Brush>();
    if (SelectedEmployee.Name == "Some Name" && SelectedProduct.Name == 
        "Some Product") newColours.AddRange( new List<Brush>() { Brushes.Red, 
        Brushes.White, Brushes.Blue } );
    else ...
}

これを行うには多くの方法がありますが、それはあなたに任せます。これで実用的な例が得られたはずですが、誰もあなたの質問に答えなかった理由がわかりました...正気な人が入力するには多すぎます! これに長い時間を費やした後、これで見つけた小さな問題を自分で解決しようとしてくれれば幸いです。

于 2013-10-11T10:25:47.813 に答える