2016-07-07 8 views
0

Ich schreibe ein kleines Projekt mit einer einfachen XML-Datenbank, Mein C# -Niveau ist niedrig, während ich lerne, während ich codiere.VS2015 C# -> Füllen von Textboxen mit Xml-Datenbank und Listbox

Ein Teil meines Projektes besteht eine Benutzerdatenbank mit dem Namen des Habens, Vorname, Login, Passwort, ...

Ich bin eine XML-Datenbank:

<?xml version="1.0" standalone="yes"?> 
<DocumentElement> 
    <Personnel> 
    <id>1</id> 
    <nom>John</nom> 
    <prenom>Doe</prenom> 
    <accelvl>1</accelvl> 
    <couleur>white</couleur> 
    <login>john.d</login> 
    <pass>123</pass> 
    </Personnel> 
    <Personnel> 
    <id>2</id> 
    <nom>Martha</nom> 
    <prenom>Blue</prenom> 
    <accelvl>5</accelvl> 
    <couleur>orange</couleur> 
    <login>martha.b</login> 
    <pass>123</pass> 
    </Personnel> 

Ich benutze diesen Code der Datenbank

 public frm_Admin() 
    { 
     InitializeComponent(); 
     CreerDGV_P(); 
     GetData_P(); 
     CreerDataTable_P(); 
    } 
    private void frm_Admin_Load(object sender, EventArgs e) 
    { 
    ListGP(); 
    } 

    BindingList<Data_P> list_P; 
    internal class Data_P 
    { 
     public int Id { get; set; } 
     public string Nom { get; set; } 
     public string Prénom { get; set; } 
     public int AccesLvl { get; set; } 
     public string Couleur { get; set; } 
     public string Login { get; set; } 
     public string Pass { get; set; } 

    } 
    public void GetData_P() //from xml 
    { 
     DataTable dt = CreerDataTable_P(); 
     dt.ReadXml(@"testbase.xml"); 
     foreach (DataRow dr in dt.Rows) 
      list_P.Add(new Data_P 
      { 
       Id = Convert.ToInt32(dr[0]), 
       Nom = dr[1].ToString(), 
       Prénom = dr[2].ToString(), 
       AccesLvl = Convert.ToInt32(dr[3]), 
       Couleur = dr[4].ToString(), 
       Login = dr[5].ToString(), 
       Pass = dr[6].ToString() 
      }); 

    } 
    private DataTable CreerDataTable_P() 
    { 
     DataTable dt = new DataTable("Personnel"); 
     dt.Columns.Add("id", typeof(int)); 
     dt.Columns.Add("nom", typeof(string)); 
     dt.Columns.Add("prenom", typeof(string)); 
     dt.Columns.Add("accelvl", typeof(string)); 
     dt.Columns.Add("couleur", typeof(string)); 
     dt.Columns.Add("login", typeof(string)); 
     dt.Columns.Add("pass", typeof(string)); 

     for (int i = 0; i < dataGridView_P.Rows.Count; i++) 
      dt.Rows.Add 
       (
       dataGridView_P[0, i].Value.ToString(), 
       dataGridView_P[1, i].Value.ToString(), 
       dataGridView_P[2, i].Value.ToString(), 
       dataGridView_P[3, i].Value.ToString(), 
       dataGridView_P[4, i].Value.ToString(), 
       dataGridView_P[5, i].Value.ToString(), 
       dataGridView_P[6, i].Value.ToString() 
       ); 

     dt.AcceptChanges(); 
     return dt; 

    } 
    private void CreerDGV_P() 
    { 
     list_P = new BindingList<Data_P>(); 
     dataGridView_P.DataSource = list_P; 
     dataGridView_P.AllowUserToAddRows = false; 
     dataGridView_P.CellEndEdit += new DataGridViewCellEventHandler(dataGridView_P_CellEndEdit); 
    } 
    private void dataGridView_P_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
    { 
     list_P[e.RowIndex].Nom = dataGridView_P[1, e.RowIndex].Value.ToString(); 
    } 
    private void button_new_bddp_Click(object sender, EventArgs e) 
    { 
     list_P.Add(new Data_P { Id = list_P.Count + 1, Nom = "" }); 
    } 
    private void button_save_bddp_Click(object sender, EventArgs e) 
    { 
     DataTable dt = CreerDataTable_P(); 
     dt.WriteXml(@"testbase.xml"); 
     ; 
    } 

    void ListGP() 
    { 
     this.listBox_GP_Fichiers.Items.Clear(); // j'efface le contenu pour mettre à jour et éviter les doublons 
     listBox_GP_Fichiers.Text = ""; 

     this.listBox_LogC.Items.Clear(); 
     listBox_LogC.Text = ""; 

     DataTable dt = new DataTable("Personnel"); 
     dt.Columns.Add("id", typeof(int)); 
     dt.Columns.Add("nom", typeof(string)); 
     dt.Columns.Add("prenom", typeof(string)); 

     for (int i = 0; i < dataGridView_P.Rows.Count; i++) 
      dt.Rows.Add(listBox_GP_Fichiers.Items.Add(dataGridView_P[1, i].Value.ToString() + " " + dataGridView_P[2, i].Value.ToString())); 
     for (int i2 = 0; i2 < dataGridView_P.Rows.Count; i2++) 
      dt.Rows.Add(listBox_LogC.Items.Add(dataGridView_P[1, i2].Value.ToString() + " " + dataGridView_P[2, i2].Value.ToString())); 

     dt.AcceptChanges(); 
     return; 
    } 

ich habe eine Datagridview in einer Form und in einer anderen Form zu binden ich habe ein Listenfeld mit Namen + Vornamen und texboxes

this is how the page looks like Jetzt möchte ich Textfelder mit allen Daten der ausgewählten Person füllen, aber funktioniert nicht, wenn ich einen Namen aus der Listbox wähle, wird nur der erste Eintrag der Datenbank in Textfeldern angezeigt, hier ist der Code, den ich verwendet:

private void listBox_GP_Fichiers_SelectedIndexChanged(object sender, EventArgs e) 
    { 

     if (listBox_GP_Fichiers.SelectedItems.Count != 0) 
     { 

      string s = ""; 

      DataTable dt = new DataTable("Personnel"); 
      dt.Columns.Add("id", typeof(int)); 
      dt.Columns.Add("nom", typeof(string)); 
      dt.Columns.Add("prenom", typeof(string)); 
      dt.Columns.Add("accelvl", typeof(string)); 
      dt.Columns.Add("couleur", typeof(string)); 
      dt.Columns.Add("login", typeof(string)); 
      dt.Columns.Add("pass", typeof(string)); 


      for (int x = 0; x <= listBox_GP_Fichiers.SelectedItems.Count - 1; x++) 
      { 
       s = listBox_GP_Fichiers.SelectedItems[x].ToString(); 

       if (s.Equals(dataGridView_P[1, x].Value.ToString() + " " + dataGridView_P[2, x].Value.ToString())) 
       { 
        Var.GP_Id = dataGridView_P[0, x].Value.ToString(); 
        Var.GP_Nom = dataGridView_P[1, x].Value.ToString(); 
        Var.GP_Prénom = dataGridView_P[2, x].Value.ToString(); 
        Var.GP_Access_Level = dataGridView_P[3, x].Value.ToString(); 
        Var.GP_Color = dataGridView_P[4, x].Value.ToString(); 
        Var.GP_Login = dataGridView_P[5, x].Value.ToString(); 
        Var.GP_MDP = dataGridView_P[6, x].Value.ToString(); 
       } 
       dt.AcceptChanges(); 

       textBox_GP_Nom.Text = Var.GP_Nom; 
       textBox_GP_Prénom.Text = Var.GP_Prénom; 
       textBox_GP_Login.Text = Var.GP_Login; 
       textBox_GP_MDP.Text = Var.GP_MDP; 
      } 
     } 
    } 

I severals sucht meine Frage versucht, aber kann nichts finden, dass

Dank

bearbeiten funktioniert für mich:

Var.cs so aussehen

public class Var 
    { 
     //Gestion du personnel 
     public static string GP_Path, GD_Path, GPQ_Path, GP_List_TS; 
     public static string GP_Nom, GP_Prénom, GP_Login, GP_MDP, GP_Access_Level, GP_Color; 
     public static string GP_Id; 
} 

es neu zu erstellen, hier unten:

form1.cs

using System; 
using System.ComponentModel; 
using System.Data; 
using System.Windows.Forms; 

namespace TestApp 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      CreerDGV_P(); 
      GetData_P(); 
      CreerDataTable_P(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      ListGP(); 
     } 


     BindingList<Data_P> list_P; 
     internal class Data_P 
     { 
      public int Id { get; set; } 
      public string Nom { get; set; } 
      public string Prénom { get; set; } 
      public int AccesLvl { get; set; } 
      public string Couleur { get; set; } 
      public string Login { get; set; } 
      public string Pass { get; set; } 

     } 
     public void GetData_P() //from xml 
     { 
      DataTable dt = CreerDataTable_P(); 
      dt.ReadXml(@"testbase.xml"); 
      foreach (DataRow dr in dt.Rows) 
       list_P.Add(new Data_P 
       { 
        Id = Convert.ToInt32(dr[0]), 
        Nom = dr[1].ToString(), 
        Prénom = dr[2].ToString(), 
        AccesLvl = Convert.ToInt32(dr[3]), 
        Couleur = dr[4].ToString(), 
        Login = dr[5].ToString(), 
        Pass = dr[6].ToString() 
       }); 

     } 
     private DataTable CreerDataTable_P() 
     { 
      DataTable dt = new DataTable("Personnel"); 
      dt.Columns.Add("id", typeof(int)); 
      dt.Columns.Add("nom", typeof(string)); 
      dt.Columns.Add("prenom", typeof(string)); 
      dt.Columns.Add("accelvl", typeof(string)); 
      dt.Columns.Add("couleur", typeof(string)); 
      dt.Columns.Add("login", typeof(string)); 
      dt.Columns.Add("pass", typeof(string)); 

      for (int i = 0; i < dataGridView_P.Rows.Count; i++) 
       dt.Rows.Add 
        (
        dataGridView_P[0, i].Value.ToString(), 
        dataGridView_P[1, i].Value.ToString(), 
        dataGridView_P[2, i].Value.ToString(), 
        dataGridView_P[3, i].Value.ToString(), 
        dataGridView_P[4, i].Value.ToString(), 
        dataGridView_P[5, i].Value.ToString(), 
        dataGridView_P[6, i].Value.ToString() 
        ); 

      dt.AcceptChanges(); 
      return dt; 

     } 
     private void CreerDGV_P() 
     { 
      list_P = new BindingList<Data_P>(); 
      dataGridView_P.DataSource = list_P; 
      dataGridView_P.AllowUserToAddRows = false; 
      dataGridView_P.CellEndEdit += new DataGridViewCellEventHandler(dataGridView_P_CellEndEdit); 
     } 
     private void dataGridView_P_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
     { 
      list_P[e.RowIndex].Nom = dataGridView_P[1, e.RowIndex].Value.ToString(); 
     } 


     void ListGP() 
     { 
      this.listBox_GP_Fichiers.Items.Clear(); // j'efface le contenu pour mettre à jour et éviter les doublons 
      listBox_GP_Fichiers.Text = ""; 


      DataTable dt = new DataTable("Personnel"); 
      dt.Columns.Add("id", typeof(int)); 
      dt.Columns.Add("nom", typeof(string)); 
      dt.Columns.Add("prenom", typeof(string)); 

      for (int i = 0; i < dataGridView_P.Rows.Count; i++) 
       dt.Rows.Add(listBox_GP_Fichiers.Items.Add(dataGridView_P[1, i].Value.ToString() + " " + dataGridView_P[2, i].Value.ToString())); 

      dt.AcceptChanges(); 
      return; 
     } 

     private void listBox_GP_Fichiers_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (listBox_GP_Fichiers.SelectedItems.Count != 0) 
      { 

       string s = ""; 

       DataTable dt = new DataTable("Personnel"); 
       dt.Columns.Add("id", typeof(int)); 
       dt.Columns.Add("nom", typeof(string)); 
       dt.Columns.Add("prenom", typeof(string)); 
       dt.Columns.Add("accelvl", typeof(string)); 
       dt.Columns.Add("couleur", typeof(string)); 
       dt.Columns.Add("login", typeof(string)); 
       dt.Columns.Add("pass", typeof(string)); 


       for (int x = 0; x <= listBox_GP_Fichiers.SelectedItems.Count - 1; x++) 
       { 
        s = listBox_GP_Fichiers.SelectedItems[x].ToString(); 

        if (s.Equals(dataGridView_P[1, x].Value.ToString() + " " + dataGridView_P[2, x].Value.ToString())) 
        { 
         Var.GP_Id = dataGridView_P[0, x].Value.ToString(); 
         Var.GP_Nom = dataGridView_P[1, x].Value.ToString(); 
         Var.GP_Prénom = dataGridView_P[2, x].Value.ToString(); 
         Var.GP_Access_Level = dataGridView_P[3, x].Value.ToString(); 
         Var.GP_Color = dataGridView_P[4, x].Value.ToString(); 
         Var.GP_Login = dataGridView_P[5, x].Value.ToString(); 
         Var.GP_MDP = dataGridView_P[6, x].Value.ToString(); 
        } 
        dt.AcceptChanges(); 

        textBox_GP_Nom.Text = Var.GP_Nom; 
        textBox_GP_Prénom.Text = Var.GP_Prénom; 
        textBox_GP_Login.Text = Var.GP_Login; 
        textBox_GP_MDP.Text = Var.GP_MDP; 
       } 
      } 
     } 

     private void button_new_bddp_Click(object sender, EventArgs e) 
     { 
      list_P.Add(new Data_P { Id = list_P.Count + 1, Nom = "" }); 
     } 

     private void button_save_bddp_Click(object sender, EventArgs e) 
     { 
      DataTable dt = CreerDataTable_P(); 
      dt.WriteXml(@"testbase.xml"); 
      ; 
      ListGP(); 
     } 
    } 
} 

Var.cs

namespace TestApp 
{ 
    public class Var 

    { 
     //Gestion du personnel 
     public static string GP_Path, GD_Path, GPQ_Path, GP_List_TS; 
     public static string GP_Nom, GP_Prénom, GP_Login, GP_MDP, GP_Access_Level, GP_Color; 
     public static string GP_Id; 
    } 
} 

und endlich der Screenshot :

Click here to show it

+0

Was ist 'Var'? Wie ist definiert? – weirdgyn

+0

Ich verwende eine separate Klasse: öffentliche statische Zeichenfolge GP_Nom, GP_Prenom, GP_Login, GP_MDP, GP_Access_Level; – Sidav

+0

ok ... klingt ziemlich seltsam: 1) 'var' ist ein ** C# ** reservierter Name 2) der Name der Klasse ist' Var' aber was ist der Name des Objekts vom Typ 'Var' Sie instanziiert? meiner Meinung nach sollten Sie vermeiden, Ambiguität zu schaffen .. .den dann den Namen der Klasse in etwas anderes als 'Var' ändern und eine Instanz dieser Klasse mit einem anderen Namen als denen der Klasse selbst erstellen. – weirdgyn

Antwort

0

Dies ist der korrekte Vorgang ... bitte beachten Sie, dass ich alle Codezeilen entfernt habe, die ich für nicht verwandt mit Ihren Bedürfnissen gefunden habe ... Sie können sie wieder einfügen, aber bitte beachten Sie, dass sie wahrscheinlich wertlos sind.

private void listBox_GP_Fichiers_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (listBox_GP_Fichiers.SelectedItems.Count == 0) 
      return; 

     for(int x = 0; x < dataGridView_P.RowCount; x++) 
     {     
      string s = ""; 
      string aux = ""; 

      s = dataGridView_P[1, x].Value.ToString() + " " + dataGridView_P[2, x].Value.ToString(); 
      aux = listBox_GP_Fichiers.SelectedItems[0].ToString(); 

      if (s.Equals(aux)) 
      { 
       Var.GP_Id = dataGridView_P[0, x].Value.ToString(); 
       Var.GP_Access_Level = dataGridView_P[3, x].Value.ToString(); 
       Var.GP_Color = dataGridView_P[4, x].Value.ToString(); 

       textBox_GP_Nom.Text = Var.GP_Nom = dataGridView_P[1, x].Value.ToString(); 
       textBox_GP_Prénom.Text = Var.GP_Prénom = dataGridView_P[2, x].Value.ToString(); 
       textBox_GP_Login.Text = Var.GP_Login = dataGridView_P[5, x].Value.ToString(); 
       textBox_GP_MDP.Text = Var.GP_MDP = dataGridView_P[6, x].Value.ToString();    
      } 
     } 
    } 
+0

auch mit 'Var' ist bedeutungslos ... – weirdgyn

+0

Vielen Dank für Ihre Zeit, es funktioniert :) Ich suchte nach einem Papier Buch, vielleicht können Sie mir sagen, ob dieser eine gute ist: C# 6 Développez des Anwendungen Windows avec Visual Studio 2015 von Jérôme Hugon? (Ich bin komfortabler mit Französisch) – Sidav

+0

Nun, ich kenne keine Französisch Bücher, aber es sieht aus wie eine gut strukturierte .. Wie auch immer, ich werde Ihnen vorschlagen, über ein 'freies' Ebook zu üben, bevor Sie ein teures Papier kaufen ... – weirdgyn

0

ich das Problem gefunden wird, werden Sie die Suche versagt ... im Code:

private void listBox_GP_Fichiers_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     // voir si il y a du personnel selectionné 
     if (listBox_GP_Fichiers.SelectedItems.Count != 0) 
     { 
      // si oui, affichage du résultat 
      string s = ""; 

      DataTable dt = new DataTable("Personnel"); 
      dt.Columns.Add("id", typeof(int)); 
      dt.Columns.Add("nom", typeof(string)); 
      dt.Columns.Add("prenom", typeof(string)); 
      dt.Columns.Add("accelvl", typeof(string)); 
      dt.Columns.Add("couleur", typeof(string)); 
      dt.Columns.Add("login", typeof(string)); 
      dt.Columns.Add("pass", typeof(string)); 

      for (int x = 0; x <= listBox_GP_Fichiers.SelectedItems.Count - 1; x++) 
      { 
       s = listBox_GP_Fichiers.SelectedItems[x].ToString(); 
       string aux = ""; 
       aux = dataGridView_P[1, x].Value.ToString() + " " + dataGridView_P[2, x].Value.ToString(); 

       if (s.Equals(aux)) 
       { 
        Var.GP_Id = dataGridView_P[0, x].Value.ToString(); 
        Var.GP_Nom = dataGridView_P[1, x].Value.ToString(); 
        Var.GP_Prénom = dataGridView_P[2, x].Value.ToString(); 
        Var.GP_Access_Level = dataGridView_P[3, x].Value.ToString(); 
        Var.GP_Color = dataGridView_P[4, x].Value.ToString(); 
        Var.GP_Login = dataGridView_P[5, x].Value.ToString(); 
        Var.GP_MDP = dataGridView_P[6, x].Value.ToString(); 


       } 

       dt.AcceptChanges(); 

       textBox_GP_Nom.Text = Var.GP_Nom; 
       textBox_GP_Prénom.Text = Var.GP_Prénom; 
       textBox_GP_Login.Text = Var.GP_Login; 
       textBox_GP_MDP.Text = Var.GP_MDP; 
      } 
     } 
    } 

Sie iterieren mal die Suche über Daten in der Datagridview N, wobei N die Zahl ist des gewählten Eintrags in der Listbox ... natürlich, da Sie nur einen Eintrag in der Listbox ausgewählt haben, durchlaufen Sie die Schleife nur 1 Mal und natürlich wird dies immer mit dem ersten Datensatz verglichen, der in der Datagridview gespeichert ist. In diesem Fall ist nur "John Doe" ... das Ergebnis ist, dass Sie Textfelder niemals mit Daten füllen werden, die sich von denen der ersten Zeile im Datenrasteransicht.

Die Lösung besteht darin, die datagridview-Elemente anstelle von ausgewählten Elementen zu durchlaufen und mit ausgewählten Elementen zu vergleichen.

Darüber hinaus habe ich eine Reihe weiterer Empfehlungen, die zu einem "Sie müssen viel mehr studieren und praktizieren" zusammenfassen. Wenn Sie möchten, kann ich Ihnen einige Hinweise geben, aber ich denke, dass das Lesen eines guten Codebuches viel besser wäre.

+0

Danke für Ihre Empfehlungen, ich benutze C# von 1 Monat und ich versuche es zu verstehen, indem ich Quellcode von anderen Leuten lese, die es teilen. – Sidav

+0

dies ist eine gute Übung, aber ich empfehle Ihnen, C# in einer strukturierten Weise zu nähern. Es gibt eine Reihe von guten Büchern, in denen C# -Codierung auf solider Basis gelernt werden kann. Schau mal dort http://it-ebooks.info/ – weirdgyn

+0

Danke für das Ebook, ich schau es mir an :) Ich habe deine Modifikation versucht, aber es zeigt immer noch den ersten Eintrag – Sidav