Diskuze: Odstranění itemu z listu
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 22 zpráv z 22.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zjistíš jaký item se vybral přes event SelectionChanged.
NejakaTrida obj=(NejakaTrida)listbox.SelectedItem
Potom ho vymažeš
listbox.Items.Remove(obj);
Já to mám takhle
for (int i = 0; i < list.SelectedItems.Count; i++)
list.Items.Remove(list.SelectedItems[i]);
ale řeším problém, že já když ukládám, tak beru data z Listu. Takže když smažu ten vybraný item v listboxu tak to potřebuju taky odebrat z Listu.
Je to easy... v listboxu si vytvoř event ItemSelectionChanged a ukládej si poslední selected index. Něco takového
private void mujlistBox_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
posledniIndex = e.ItemIndex;
}
tak, teď máš poslední selected index po každém změnění
// smažu item z listboxu nebo jak to máš řešené
for (int i = 0; i < list.SelectedItems.Count; i++)
list.Items.Remove(list.SelectedItems[i]);
// smažu item z listu
MujList.Remove(posledniIndex);
ta metoda je pro listview ... akorát vytvoř metodu SelectIndexChanged v
listboxu místo listvieweu.. prve jsem to psal pro listview
int posledniIndex = 0;
// tlacitko na mazani
private void button1_Click(object sender, EventArgs e)
{
mujlist.Remove(mujlist[posledniIndex]);
for (int i = 0; i < listBox1.SelectedItems.Count; i++)
listBox1.Items.Remove(listBox1.SelectedItems[i]);
listBox1.Items.Clear();
vyplnBox(); // precte data z listu a naplni tak listbox
}
// ulozim posledni index
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
posledniIndex = listBox1.SelectedIndex;
}
To vyplnění tam být nemusí, ani clear. Jen jsem zkoušel jestli se to
opravdu vymazalo.
njn index je mimo hranici pole, tenhle kousek kódu mi fakt nic moc neřekne
tady je celá editace
private void button5_Click(object sender, EventArgs e)
{
// nacteni hodnot
string jmeno = textBox1.Text;
int utok = Convert.ToInt32(edutok.Value);
int cena = Convert.ToInt32(edcena.Value);
int level = Convert.ToInt32(edlvl.Value);
string Cesta = label5.Text;
// nove hodnoty predetu
textBox1.Text = jmeno;
edutok.Text = utok.ToString();
edcena.Text = cena.ToString();
edlvl.Text = level.ToString();
Cesta = label13.Text;
// pridadani veci do Listu a do listboxu
databaze.PridejUzivatele(jmeno, utok, cena, level, Cesta);
list.Items.Add(new Vec(jmeno, utok, cena, level, Cesta));
// Odebrani veci z listu
databaze.veci.Remove(databaze.veci[posledniIndex]);
//odbrani z listboxu
for (int i = 0; i < list.SelectedItems.Count; i++)
list.Items.Remove(list.SelectedItems[i]);
}
jinak v ListBoxu to mám tak jak jsi to psal.
můůů přemejšlej trochu, když index je mimo hranici pole, tak se asi index v metode selected item changed nebo jak se jmenuje někde stala zrada a lastindex bude nejspíš -1 a to nesmí... Takže si mohl pomocí try catch zjistit kolik je index při tom když to vyhodí tu chybu.
if (lastindex >= 0)
{
mujlist.Remove(mujlist[lastindex]);
for (int i = 0; i < listBox1.SelectedItems.Count; i++)
listBox1.Items.Remove(listBox1.SelectedItems[i]);
}
Index vždy po stisku tlačítka uložit změny klesne na -1.
Využij můj způsob. Je zbytečný projíždět celou kolekci. Vezmi si
prostě Selecteditem a potom zavoláš metodu Remove a vložíš vybraný item
NejakaTrida obj=(NejakaTrida)listbox.SelectedItem;
listbox.Items.Remove(obj);
Try a Catch je na ošetření uživatelských vstupů, ne na odstraňování
programátorových chyb a problémů
Buď jsem nepochopil já tebe, nebo ty mě . Já potřebuju odstranit tu
vybranou položku z listu i z listboxu. Jak jí odendat z listboxu to vím, ale
potřebuju jí zároveň oddělat z listu.
Říkám, že lze zjistit jednoduše chybu při pádu aplikace, kdy normálně padne tak si tam dát try catch a nechat si vypsat index, který nám tam dělá bordel ať vím jestli je mínusový nebo nikoli. Tak mě nepoučuj. Rozhodně je to pohodlnější než přes breakpointy v debugování. Dokonce i rychlejší.
To že jsem ti už asi 3x napsal řešení stále nestačí? Zirko píše ať to z listboxu
nemažeš tak že kontroluješ všechny indexy... vem si že jich tam může
být i o dost víc než tam máš teď. Tak ti tím chtěl říct ať tuhle
část uděláš tak..že to bude asik rychlejší a ta druhá část už je tu
3x napsaná. Achjo
Stejným způsobem to vymažeš i z listu ne ? Pokud to máš stejné
objekty, tj jak listbox.Items.Remove(obj) tak i list.Remove(obj). Není co
řešit..
Právě jsem přišel na to proč to nechtělo fungovat. Upravoval jsem data z listu, ale neuvědomil jsem si, že když jsem načítal tak jsem data neukládal do listu, ale vkládal jsem je přímo do listboxu, takže ten tvůj první kód jak jsi mi poradil, je dobrej. Nefungovalo to jen kvůli mé blbosti.
Ahoj, učím se programovat v C# dostal jsem úkol:Cílem zadání je vytvořit konzolový TODO list s možností přidávání nových událostí, zobrazením jejich seznamu a mazaním. Dále pak uložení seznamu událostí do souboru a jeho opětovné načtení. Úkol se snaž plnit po částech, jak je rozdělen níže.
## 1. část
Cílem 1. části je vytvořit TODO list se třemi základními příkazy, pro zadaní, zobrazení a smazání. Každý úkol bude mít tři atributy, int id, string ukol a DateTime deadline. Hodnoty, které bude zadávat uživatel jsou uvedeny v hrantých závorkách.
### Příkazy
* Přidání nového úkolu s deadlinem. Novému úkolu se přiřadí id, podle kterého pak půjde smazat.
>>> add [úkol] [deadline]
* Zobrazení seznamu všech dosud přidaných úkolů. Zobrazí zadané úkoly s jejich id a deadliny, každý na nový řádek.
>>> list
* Odebrání existujícího úkolu podle id.
>>> del [id]
### Příklad
>>> add "Vysát si doma" "1.9.2022"
>>> Úkol "Vysát si doma" do 01.09.2022 úspěšně uložen s id 1.
>>> add "Nakoupit" "2.9.2022"
>>> Úkol "Nakoupit" do 02.09.2022 úspěšně uložen s id 2.
>>> list
>>> 1 | "Vysát si doma" | 01.09.2022
>>> 2 | "Nakoupit" | 02.09.2022
>>> del 1
>>> Úkol "Vysát si doma" do 01.09.2022 odstraněn.
>>> list
>>> 2 | "Nakoupit" | 02.09.2022
## 2. část
Cílem 2. části je umožnit uložení zadaných úkolů do souboru (vymysli vhodný formát) a opětovné načtení souboru. Úkoly tak půjdou uložit, ikdyž program skončí.
### Příkazy
* Uložení dosud zadaných úkolů do souboru.
>>> save [název souboru]
* Načtení úkolů se souboru.
>>> load [název souboru]
Můj kód zatím vypadá takto:using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OnlineApp
{
class Ukol{
public int id;
public string ukol;
public DateTime deadline;
}
class Program
{
static void Main(string[] args)
{
List<string> id = new List<string>();
id.Add("Pavel Novak");
id.Add("Jakub Novák");
id.Add("Petr Novak");
id.Add("Jiří Novak");
id.Add("Adam Novak");
List<Ukol> ukoly = new();
Ukol ukol = new();
ukol.id = 1;
ukol.ukol = "Vysat";
ukoly.Add(ukol);
ukol = new();
ukol.id = 2;
ukol.ukol = "Vyprat";
ukoly.Add(ukol);
ukol = new();
ukol.id = 3;
ukol.ukol = "Pověsit prádlo";
ukoly.Add(ukol);
string r = Console.ReadLine();
string[] pole = r.Split(" ");
Console.WriteLine(pole[0]);
Console.WriteLine
//Console.WriteLine(id[0]);
//List<string> task = new();
//task.Add(id[1]);
//Console.WriteLine(task[1]);
}
}
}
Chci se zeptat jakým příkazem docílím toho vymazat treba úkol co má ID 1 ?
Děkuji za odpověď
Zobrazeno 22 zpráv z 22.