0

前もってお詫び申し上げます。明確にするのが難しいかもしれません。私は検索しましたが、私が従うには議論が複雑すぎて、C# に住み始めたばかりです。

プロジェクト: C# WindowsForm / .NET 4.5 / Visual Studio 2012

課題: リストボックスから別のリストボックスに項目を追加し (リストと foreach ループで簡単に実行できます)、listbox2 での選択に応じて最後のリストボックスに特定の項目を表示させたいと考えています。

説明: 選択した項目は、さらに別のリスト ボックスで作成したグループを組み込むためのものです。そのため、リストボックス 1 でいくつかの項目を選択すると、リスト ボックス 3 に送信されますが、リスト ボックス 2 で特定の項目を選択した場合にのみ表示されます。

リストからゲームを選択し、それを新しいリストの「Nintendo」グループに追加して、listbox2 でセガが選択されたときにセガのものと混ざらないようにすることを想像してみてください。

すべてのリストボックスに値を追加し、必要なものを 1 から 3 にコピーできますが、2 の選択を尊重して選択する方法に途方に暮れています。

データバインディングなどについて読んだことがありますが、例が複雑すぎました (そして、言語の壁が少し存在していた可能性があります)。本当に小さなプロジェクトに最も簡単なソリューションを提供できるリソースはありますか?

素人の言葉を使って愚か者を啓発してください。

ありがとう

編集:私の質問に反対票を投じてくれてありがとう(あなたが誰であれ)。けっこうだ。少なくとも、問題が何であるか、または質問がどこで回答されたかを教えていただければ、問題を解決できます。それはいいと思いませんか?私は C# の初心者なので、最初の質問がばかげている/怠惰に見えるのは当然のことです...

4

3 に答える 3

1

簡単にするために、リストボックスにバインドされたアイテムが文字列であると仮定しましょう。次に、辞書を使用してグループの割り当てを保持できます (どこかに保持する必要があります)。

Dictionary<string, List<string>> listOfGroups = new Dictionary<string, List<string>>();

キーはグループの名前で、文字列のリストはグループ内のアイテムを保持します。次に、どこかで、値を割り当てるグループを作成します

void CreateGroup(string groupName)
{
     listBox2.Items.Add(groupName);
     if (!listOfGroups.ContainsKey(groupName)
                listOfGroups.Add(groupName, new List<string>());
}

次に、アイテムをグループで管理し、たとえば listBox2 の選択が変更されたときにアイテムを追加/削除します。

string item = (string)listBox1.SelectedItem;

if(!listOfGroups.ContainsKey((string)listBox2.SelectedItem))
    listOfGroups.Add((string)listBox2.SelectedItem,new List<string>());
((List<string>)listOfGroups[(string)listBox2.SelectedItem]).Add(item);

listBox3.Items.Add(item);
listBox1.Items.Remove(item);

そして最後に:

private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
{
    listBox3.Items.Clear();
    if (!listOfGroups.ContainsKey((string)listBox2.SelectedItem))
        listOfGroups.Add((string)listBox2.SelectedItem, new List<string>());

    listBox3.Items.AddRange(listOfGroups[(string)listBox2.SelectedItem].ToArray());

    List<string> list = listOfAllItems.Where(a => !listBox3.Items.Contains(a)).ToList();
    listBox1.Items.Clear();
    listBox1.Items.AddRange(list.ToArray());
}

ただし、それは単なるアイデアです。DataSet を使用している場合は、(辞書の代わりに) linq を使用して、listbox2 での選択が変更された後に表示する項目を選択することができます。

于 2013-07-09T12:39:52.423 に答える
1

DataBinding がその方法です。注目すべき主なコンポーネントはBindingSourceです。また、基礎となるデータのDataSetを調査することもできます。これは、フィルタリングにある程度の柔軟性を与えるからです。ただし、これが小規模なアプリケーションであり、学習のみを行う場合は、次の例が適切な出発点になる可能性があります。

各リストボックスの をフォームにドラッグBindingSourceします。次に、ListBox の各DataSourceプロパティを対応するに接続しBindingSourceます。

BindingSourcesこれは、リストボックスにすでにバインドされているそれぞれに、基になるデータをバインドする方法を示すコードビハインドの例です。

namespace WindowsFormsApplication1
{
    public class Game
    {
        public string Name { get; set; }
        public string Group { get; set; }
    }

    public class Group
    {
        public string Description { get; set; }
    }

    public partial class Form1 : Form
    {
        List<Game> _allGames;

        public Form1()
        {
            InitializeComponent();

            _allGames = new List<Game>
            {
                new Game { Name = "Alpha", Group = "" },
                new Game { Name = "Bravo", Group = "One" },
                new Game { Name = "Charlie" , Group = "One"},
                new Game { Name = "Delta", Group = "Two" }
            };

            bindingSource1.DataSource = _allGames;
            listBox1.DisplayMember = "Name";
            listBox1.ValueMember = "Name";

            var groups = new List<Group>
            {
                new Group { Description = "One" },
                new Group { Description = "Two" },
                new Group { Description = "Three" }
            };

            bindingSource2.DataSource = groups;
            listBox2.DisplayMember = "Description";
            listBox2.ValueMember = "Description";
        }

        private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            var group = listBox2.SelectedValue.ToString();
            bindingSource3.DataSource = _allGames.Where(x => x.Group == group);
            listBox3.DisplayMember = "Name";
        }
    }
}

このコードが行っているのは、データを BindingSource にバインドし、基になるデータのどのプロパティを表示するかを各 ListBox に伝えることだけです。この例では、listBox1 の各項目を listBox2 のグループに割り当てるメカニズムを無視しています。これは、その方法を知っているか、理解できると想定しているためです。

listBox2 が変更されたときのイベント ハンドラーは、どの選択が行われたかを取得し、その項目に一致する listBox1 から項目のリストを作成し、それらの項目を listBox3 に表示します。

于 2013-07-09T12:45:10.827 に答える
0

ある種の Dictionary を保存できます。キーは最初の ListBox の要素であり、値は 2 番目の ListBox の項目です。

于 2013-07-09T12:01:27.990 に答える