C# problem z usuń, szukaj przyciskiem

0

Witam, po pierwsze zanim zacznę to prowadzę naukę w szwecji dlatego opisy są nie po polsku. Uczę się od 2,3 tyg więc nie wszystko wiem co i jak także prosiłbym o bardziej jasne wytłumaczenie błędów jakie popełniam.

Mam mały problem z przyciskiem usuń użytkownika (Ta_bortknap_Click). Nie działa i nie wiem jak to zrobić.

Drugi problem to wyszukiwanie (Sökknap_Click) Aktualnie jest tak że mogę wyszukiwać jedynie po Imieniu i jak zrobić aby wyszukiwać po nr telefonu czy mejlu itd?!
adress.PNG

namespace Inlämningsuppgift_1
{
    public partial class Form1 : Form
    {
        //Vägen till filen
        public string path = @"C:\temp\AdressBok.txt";
 
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Avslutaknap_Click(object sender, EventArgs e)
        {
            //Stänger ner programmet
            this.Close();
        }
 
        private void Rensaknap_Click(object sender, EventArgs e)
        {
            //Rensar listBox
            listBox1.Items.Clear();
            textBox1.Clear();
            textBox2.Clear();
            textBox3.Clear();
            textBox4.Clear();
            textBox5.Clear();
            textBox6.Clear();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            //Skapar txt fillen
            var file = @"C:\temp\AdressBok.txt";
            if (!File.Exists(file))
                File.Create(file);
 
            Loading();
 
            //Ändrad FormBorderStyle till FixedSingle så att man kan inte ändra storleken
            //samt MaximizeBox to False
        }
 
        private void Registeraknap_Click(object sender, EventArgs e)
        {
            //Läser in klassen och läggs till värde 
            Person person = new Person(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text,
               textBox6.Text);
 
            //Om Register metoden går genom då rensas alla rutor
            if (person.Register())
            {
                listBox1.Items.Add(person.Name);
                //Rensar textbox efter man har tryck register kanpen
                textBox1.Clear();
                textBox2.Clear();
                textBox3.Clear();
                textBox4.Clear();
                textBox5.Clear();
                textBox6.Clear();
            }
        }
 
        private void Uppdatera_knapp_Click(object sender, EventArgs e)
        {
             try
            {

                string oldUserInput = listBox1.SelectedItem.ToString();
                string newUserInput = textBox1.Text + ',' + textBox2.Text + ',' + textBox3.Text + ',' + textBox4.Text + ',' + textBox5.Text + ',' + textBox6.Text;

                string data = File.ReadAllText(path);
                string value = data.Replace(oldUserInput, newUserInput);

                File.WriteAllText(path, value);
                MessageBox.Show("Sparat!");

            }
            catch (Exception)
            {

                MessageBox.Show("Error!");

            }
         
        }
     
 
        private void Ta_bortknap_Click(object sender, EventArgs e)
        {
            //Raderar kontakt
            List<string> linesToKeep = new List<string>();
            string Name = textBox1.Text;
            string Gatu = textBox2.Text;
            string Postnr = textBox3.Text;
            string Postort = textBox4.Text;
            string Telefon = textBox5.Text;
            string Email = textBox6.Text;
            string line;
            string lineDelete = ($"{Name}, {Gatu}, {Postnr}, {Postort}, {Telefon}, {Email}");
 
 
            using (StreamReader sr = new StreamReader(@"C:\temp\AdressBok.txt"))
            {
                while ((line = sr.ReadLine()) != null)
                {
                    if (line.CompareTo(lineDelete) != 0)
                    {
 
                        linesToKeep.Add(line);
                    }
                }
            }
            using (StreamWriter sw = new StreamWriter(@"C:\temp\AdressBok.txt"))
            {
                foreach (var i in linesToKeep)
                {
                    sw.WriteLine(i);
                }
            }
            MessageBox.Show("Raderat !");
        }
 
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            List<string> lines = File.ReadAllLines(@"C:\temp\AdressBok.txt").ToList();
            Loading();
 
 
 
 
            foreach (string a in lines)//Foreach-loop som går igenom hela textfilen och kategoriserar texten i olika index. 
            {
                string[] vektor = a.Split(new string[] { "," }, StringSplitOptions.None);
                string Name = vektor[0];
                string Adress = vektor[1];
                string Zipcode = vektor[2];
                string Locality = vektor[3];
                string Phone = vektor[4];
                string Email = vektor[5];
 
 
 
                if (listBox1.SelectedItem.ToString() == Name.ToString())
                {
                    MessageBox.Show(Name.ToString() + " " + Adress.ToString() + " " + Zipcode.ToString() + " " + Locality.ToString() + " " + Phone.ToString() + " "
                        + Email.ToString());
 
                    textBox1.Text = Name.ToString();
                    textBox2.Text = Adress.ToString();
                    textBox3.Text = Zipcode.ToString();
                    textBox4.Text = Locality.ToString();
                    textBox5.Text = Phone.ToString();
                    textBox6.Text = Email.ToString();
                }
            }
        }
 
        private void Ladda_uppknap_Click(object sender, EventArgs e)
        {
            //Tömmer tidigare sökresultat
            listBox1.Items.Clear();
 
            //Vissar allt från txt filen i listBoxen
            List<string> lines = File.ReadAllLines(path).ToList();
            foreach (string linet in lines)
            {
                listBox1.Items.Add(linet);
            }
        }
 
        private void Sökknap_Click(object sender, EventArgs e)
        {
            ////Söker om namnet finns i bla txt filen och då visas i vänstra rutan (listbox).
 
            string text = textBox7.Text;
            listBox1.Items.Clear();
 
            List<string> lines = File.ReadAllLines(@"C:\temp\AdressBok.txt").ToList();
            foreach (string a in lines)//Foreach-loop som går igenom hela textfilen och kategoriserar texten i olika index. 
            {
                string[] vektor = a.Split(new string[] { "," }, StringSplitOptions.None);
                string Name = vektor[0];
                string Adress = vektor[1];
                string Zipcode = vektor[2];
                string Locality = vektor[3];
                string Phone = vektor[4];
                string Email = vektor[5];
 
                if (Name.ToLower() == textBox7.Text.ToLower())
                {
                    listBox1.Text = vektor[0];
                    listBox1.Items.Add(Name.ToString());
                }
 
            }
        }
 
        ////Vid starten läser allt från txt filen och lägger till listan
        public void Loading()
        {
            StreamReader sr = new StreamReader(path);
            string line = "";
            while (!sr.EndOfStream)
            {
                line = sr.ReadLine();
                var array = line.Split(',');
                string Name = array[0];
                string Adress = array[1];
                string Postnr = array[2];
                string Postort = array[3];
                string Telefon = array[4];
                string Email = array[5];
            }
            sr.Close();
        }
    }
}

1

Pierwsze co zrób to wywal niestandardowe znaki z nazw metod.

0

Czy sprawdziłeś debuggerem?
Zobacz co się dzieje w wierszu:
if (line.CompareTo(lineDelete) != 0)
Kiedy właśnie odczytałeś rekord który musi być skasowany.

0

Udało mi się rozwiązać problem z przyciskiem usuń. Problemem była spacja między poszczególnymi wartościami. Jedyny problem jaki teraz mam to przycisk szukaj. Np kiedy mam dwa takie same kontakty i tym samym imieniu wtedy robi się problem kiedy na jakiś klikam.

//Tak jest poprawnie
string lineDelete = ($"{Name},{Gatu},{Postnr},{Postort},{Telefon},{Email}");
3
AtomBari22 napisał(a):

Jedyny problem jaki teraz mam to przycisk szukaj. Np kiedy mam dwa takie same kontakty i tym samym imieniu wtedy robi się problem kiedy na jakiś klikam.

Jaki problem? Że nie przywidziałeś unikalnego Id?

0

Jakbym wszystko przewidział i wszystko potrafił to bym tutaj nie pisał i oczekiwał odpowiedzi od takich cwaniaków. Uczę się dopiero 2 tyg nie wszystko wiem jak zrobić jeśli nie wiesz jak pomóc to te swoje mądrości wsadz sobie wiesz gdzie

3

Standardem jest język angielski, głównie w nazwach, ale także i w komentarzach na wypadek np. taki jak teraz, gdy dzielisz się kodem z ludźmi nie posługującymi się jezykiem szwedzkim.

Jeśli Twój kod wymaga komentarza, to zwykle oznacza to, że coś jest napisane nieczytelnie i wymaga refactoringu albo przepisania.

Część nazw kontrolek masz po angielsku, część po szwedzku, nie boli Cię ten bałagan?

Definiujesz sobie path, po czym nie używasz go, tylko definiujesz ścieżkę w kilkunastu miejscach.

Loading(); - metody nazywa się czasownikiem. Tutaj - Load. Sama metoda nic nie robi, ot w pętli wszystko wczytuje do lokalnych zmiennych. Co najwyżej jest to walidacja danych.

"Raderat !" - przed wykrzyknikiem nie stawia się spacji.

if (person.Register()) - jeśli metoda zwraca bool, to powinna zaczynać się od przedrostka Is/Has/Can/Are/Should itp. Ignorujesz przypadek, kiedy Register zwróciło false, wypadałoby poinformować użytkownika, że coś się nie udało. Ponadto do obsługi sytuacji wyjątkowych wypadałoby użyć wyjątku lub jego odpowiednika, wtedy Register od biedy nie byłoby złą nazwą.

string oldUserInput = listBox1.SelectedItem.ToString(); - czy to na pewno robi to, czego się spodziewasz? Przeciążyłeś ToString()? A jeśli trzymasz tam string z samą nazwą użytkownika, to nie jest to oldUserInput, tylko oldPersonName. A właśnie, raz używasz nazwy user, a raz person.

string newUserInput = textBox1.Text + ',' + textBox2.Text + ',' + textBox3.Text + ',' + textBox4.Text + ',' + textBox5.Text + ',' + textBox6.Text; - w innych miejscach używasz interpolacji, czyli wiesz, że istnieje. Czemu tutaj nie użyłeś? BTW nazwy kontrolek to porażka.

catch (Exception) -> catch, ale wypadałoby użytkownikowi pokazać coś więcej, niż samo "Error", np. dodać do tego ex.Message.

string lineDelete = ($"{Name}, {Gatu}, {Postnr}, {Postort}, {Telefon}, {Email}"); - to w końcu używasz spacji do rozdzielania danych, czy nie? Po co te nawiasy? Przenieś generowanie linii do tej swojej klasy Person, wtedy będziesz mieć wszystko w jednym miejscu (DRY) i będzie spójnie.

Ta_bortknap_Click -> W skrócie:

var personToRemove = new Person(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text, textBox6.Text);
var lineToRemove = personToRemove.GetLine();
var allLines = File.ReadAllLines(path);
var allLinesExceptRemoved = allLines.Where(line => line != lineToRemove);
File.WriteAllLines(allLinesExceptRemoved);

przy czym storage powinna obsługiwać poprzez interfejs osobna klasa, jakieś repozytorium.
Wtedy

var personToRemove = new Person(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text, textBox6.Text);
personRepository.Remove(personToRemove);

Swoją drogą to usuwać powinieneś po jakimś unikalnym identyfikatorze, w ogóle do całej identyfikacji użytkownika powinieneś tego używać, tak jak zasugerował @_13th_Dragon.

listBox1_SelectedIndexChanged - po co te przypadkowe puste linijki?

List<string> lines = File.ReadAllLines(@"C:\temp\AdressBok.txt").ToList(); - niepotrzebna nazwa typu przy deklaracji zmiennej. Niepotrzebne ToList(), bo po lines iterujesz tylko raz.

if (listBox1.SelectedItem.ToString() == Name.ToString()) - czasem używasz ToLower, czasem nie. Konsekwencja!

listBox1.Text = vektor[0]; listBox1.Items.Add(Name.ToString()); - Name zawiera to samo, co vektor[0], do tego ma spoko nazwę, po co więc używasz tej tablicy? BTW to nie żaden wektor, tylko dane Twojego użytkownika. Opakuj to swoją klasą Person, to będzie Ci się dużo przyjemniej pracować.

1 użytkowników online, w tym zalogowanych: 0, gości: 1