IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
matesax
Tvůrce
Avatar
matesax:20.11.2012 17:58

Dictionary binding?

Dobrý den,
mám slovník - klíč string a hodnota List<string>. No a potřebuji to vyobrazit uživateli - pro každý klíč vypsat seznam z jeho hodnoty - List<string>. Tak aby šlo jednotlivé položky procházet a popř mazat. Potčřeboval bych vykreslit každý klíš na úrovni 1 a každou položku z listu co je hodnotou na úrovni 2 - odsazeně.

klíč1
    hodnota1
    hodnota2
    hodota3
klíč2
    hodnota1

Nechce se mi vytvářet další úložiště dat - když už mám ten slovník. Ale zase když budu v timeru neustále vykreslovat, nepůjde na položky klikat - s každým novým vykreslením by se vymazaly SelectedItems. Nešlo by udělat binding na tento slovník? Děkuji.

Editováno 20.11.2012 17:59
 
Odpovědět
20.11.2012 17:58
Avatar
Odpovídá na matesax
Drahomír Hanák:20.11.2012 18:08

Asi bych to implementoval jako Observer (http://www.itnetwork.cz/…avrhovy-vzor) Udělat si nějaký Scope, kam budeš ukládat data, a odtud si je budou moct všichni Pozorovatelé vytáhnout. Při každé změně pak provedeš překreslení.

Možná už je to implementované někde v .NETu, nevím. V C# nemám moc rozsáhlé znalosti. Ale udělat si to sám nebude žádný problém.

Editováno 20.11.2012 18:09
 
Nahoru Odpovědět
20.11.2012 18:08
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Drahomír Hanák
matesax:20.11.2012 20:27

Vyřešeno následovně:

using System;
using System.Linq;
using System.Diagnostics;
using System.Windows.Forms;
using System.Collections.Generic;

namespace Eodenom
{
    public partial class Main : Form
    {
        private Dictionary<string, List<string>> actions = new Dictionary<string, List<string>>();
        private OpenFileDialog opf = new OpenFileDialog();

        public Main()
        {
            InitializeComponent();

            dateTimePicker1.MinDate = DateTime.Now;
        }

        private void Actualize()
        {
            panel1.Controls.Clear();

            foreach (string key in actions.Keys)
            {
                ListBox row = new ListBox() { Dock = DockStyle.Top, SelectionMode = SelectionMode.MultiExtended };
                row.Items.AddRange(actions[key].ToArray());
                row.KeyDown += new KeyEventHandler(row_KeyDown);
                row.Tag = key;
                panel1.Controls.Add(row);
                panel1.Controls.Add(new Label() { Text = key, Dock = DockStyle.Top, TextAlign = System.Drawing.ContentAlignment.MiddleCenter });
            }
        }

        private void row_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.Delete)
            {
                ListBox who = sender as ListBox;
                string key = who.Tag as string;

                foreach (string item in who.SelectedItems)
                    actions[key].Remove(item);

                if (actions[key].Count == 0)
                    actions.Remove(key);

                Actualize();
            }
        }

        private void textBox1_Click(object sender, EventArgs e)
        {
            opf.ShowDialog();
            textBox1.Text = String.Join(", ", opf.FileNames);
        }

        private void addButton_Click(object sender, EventArgs e)
        {
            string value = dateTimePicker1.Value.ToString("dd HH:mm");

            if (actions.ContainsKey(value))
                actions[value].AddRange(opf.FileNames);
            else
                actions.Add(value, opf.FileNames.ToList());

            Actualize();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            string potentialKey = DateTime.Now.ToString("dd HH:mm");

            if (actions.ContainsKey(potentialKey))
            {
                foreach (string file in actions[potentialKey])
                    Process.Start(file);

                actions.Remove(potentialKey);
            }

            Actualize();
        }
    }
}

Timer má interval 60 000 ms...

 
Nahoru Odpovědět
20.11.2012 20:27
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:20.11.2012 20:40

Piš kratší řádky, z některých vidím sotva polovinu. Řádek přes 140 znaků je fakt úlet. Správně by neměl překročit 80 znaků.

Nahoru Odpovědět
20.11.2012 20:40
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.