Autor Beitrag
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 19.06.14 08:47 
Hallo,

du mußt über die List-Einträge iterieren (und nicht über die Eigenschaften), d.h.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
foreach (CustomerContact customerContact in ListCustomerContact)
{
    // und nun der Zugriff auf die Eigenschaften
    Console.WriteLine(customerContact.Name);
    // weitere Eigenschaften ansprechen...
}

(statt dem Namen der Klasse kann man auch einfach var benutzen, denn der Compiler kennt den Datentyp der Einträge über der zu iterierenden Liste)

Der Datentyp string würde ja nur bei deiner im ersten Beitrag gezeigten List<string> zu verwenden sein.
Allgemein also bei einer List<T>:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
List<T> list = ...;
foreach (T t in list)
{
   // Zugriff auf t
}

Anscheinend hast du vor lauter Modellierung die Grundlagen noch nicht ganz verstanden oder wieder vergessen. ;-)
Talemantros hat folgendes geschrieben:
Oder muss ich eventuell 2 Foreach irgendwie koppeln, damit die erste alle Zeilen durchläuft und die zweite alle Spalten?

Und es scheint so, als denkst du noch nicht objektorientiert genug. Die Darstellung im DataGridView erfolgt zwar in Zeilen und Spalten, intern ist es aber nur eine Liste von Objekten, d.h. der Zugriff muß dann auch auf diesen Objekten erfolgen (was nicht unbedingt ein string sein muß).
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Do 19.06.14 09:05 
Danke.
Ja leider ist mein Ansporn es richtig zu machen mir irgendwie im Weg :-(
Kostet mich Zeit und nerven und wenn es einmal nicht geht verfalle ich gleich in Stress.

Vielen Dank. Habe jetzt noch einen Termin dann teste ich das mal.

Gruß
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Do 19.06.14 16:16 
Danke, das hat gut funktioniert.

Nun habe ich noch ein wenig zum Lernen Dinge verändert und versucht bei den Ansprechpartnern auch mit DataBinding der TextBoxen zu arbeiten.

Basierend auf der CustomerContact

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
    public class CustomerContact
    {
        public string Authority { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        public string Number { get; set; }
        public string Mobil { get; set; }
        public string Fax { get; set; }
    }


habe ich die List in Customer

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
    public class Customer
    {
        public Customer()
        {
            ListCostumerContact = new List<CustomerContact>();
        }

        public List<CustomerContact> ListCostumerContact { get; private set; }
    }


Diese Eigenschaft habe ich an das DataGridView gebunden
Im Form selber habe ich

ausblenden C#-Quelltext
1:
            bsListCustomerContact.Add(new CustomerContact());					


und die TextBoxen der Ansprechpartner habe ich per Databinding angebunden.
Wenn ich nun dort was eintrage wird es auch Ordnungsgemäß in der List eingetragen und im DataGridView angezeigt.

Nun soll beim Drücken auf "weiterer Ansprechpartner" ein neuer Ansprechpartner erfasst werden können

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
        private void btnContactErfassen_Click(object sender, EventArgs e)
        {
            try
            {
                    bsListCustomerContact.Add(new CustomerContact());
            }
            catch (Exception ex)
            {
                MySqlError.SetError(ex.Message, this.ToString(), Global.GetCurrentFunctionName());
                MsgAusgabe.ShowError(ex.Message);
            }
         }


Dadurch wird im DatagridView eine neue Zeile angezeigt und wenn ich diese anklicke werden auch die TextBoxen geleert.

Nun wollte ich dies automatisiert machen, damit nach dem Klick auf den Button gleich alle Felder leer sind

Dazu habe ich

ausblenden C#-Quelltext
1:
2:
                    dgvAnsprechpartner.ClearSelection();
                    dgvAnsprechpartner.Rows[dgvAnsprechpartner.Rows.Count -1].Cells[0].Selected = true;


Er markiert diese Zeile auch, aber die TextBoxen werden nicht geleert.

Beim Klicken mit der Maus geht es, automatisiert nicht!

Würde mich über einen Tipp freuen.

Danke
Einloggen, um Attachments anzusehen!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 19.06.14 17:17 
BindingSource.Add liefert dir den Index des neuen Elements in der Liste. Dahin solltest du dann die Position in der Bindingource verschieben wenn dieser Datensatz der aktuelle werden soll.

ausblenden C#-Quelltext
1:
bsListCustomerContact.Position = bsListCustomerContact.Add(new CustomerContact());					
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Do 19.06.14 19:51 
Vielen Dank.

Nun habe ich noch eine Kleinigkeit dann bin ich mit dem Teil erst mal zufrieden denke ich :-)

Ich wollte nun, dass jeder Ansprechpartner nur einmal erfasst werden kann und habe nach etwas InternetRecherche folgendes gefunden

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
        private void btnContactErfassen_Click(object sender, EventArgs e)
        {
            try
            {
                if (newCostumer.ListCostumerContact.Exists(x => x.Name == txtAnsprech.Text))
                    MsgAusgabe.ShowError("Dieser Ansprechpartner wurde bereits erfasst");
                else
                    bsListCustomerContact.Position = bsListCustomerContact.Add(new CustomerContact()); 
            }
            catch (Exception ex)
            {
                MySqlError.SetError(ex.Message, this.ToString(), Global.GetCurrentFunctionName());
                MsgAusgabe.ShowError(ex.Message);
            }
         }


Theoretisch funktioniert es auch, aber leider liefert es immer true zurück, da durch das DataBinding ja der erste Eintrag auch schon in der List ist und somit vorhanden!
Wie könnte ich den da vorgehen?

Gruß
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 19.06.14 20:18 
Den Namen als identifizierendes Merkmal einer Person ist ziemlich unnütz. Es gibt Personen die gleich heißen Punkt. Um etwas eindeutig zu identifzieren sollte es eine irgendwie geartete ID geben.
Etwas das vom System vorgeben wird und nicht vom User und somit automatisch eindeutig (unique) ist. Wenn du dann trotzdem noch aus irgendeinem Grund Namen eindeutig haben willst bist du dann in der Lage anhand der ID diesen Datensatz von dem du ausgehend vergleichen willst in der Bedingung auszuschließen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
CustomerContact contact = bsListCustomerContact.Current As CustomerContact;

if (newCostumer.ListCostumerContact.Exists(x => (x.Name == contact.Name) && (x.ID != contact.ID))
{
   ....
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Fr 20.06.14 09:42 
Guten Morgen,
dies hinzufügen der Id hat super funktioniert.

Danke

Gruß