VS2015 C# - >如何使用Xml数据库和列表框填充文本框

时间:2016-07-07 08:09:43

标签: c# xml database datagridview listbox

我使用简单的xml数据库编写了一个小项目,我的C#级别很低,因为我在编写代码时学习。

我项目的一部分包括拥有名称,名字,登录名,密码......的用户数据库。

我正在使用xml数据库:

<?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>

我使用此代码绑定数据库

     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;
    }

我在表单中有一个datagridview,在另一种表单中我有一个名为+ firstname和texboxes的列表框

this is how the page looks like          现在我想用所选人员的所有数据填充文本框但是不起作用,当我从列表框中选择一个名称时,只有数据库的第一个条目显示在文本框中,这里是&#39; s我使用的代码:

 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;
            }
        }
    }

我尝试过多次搜索我的问题,但无法找到适合我的任何内容

由于

编辑:

Var.cs看起来像这样

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;
}

重新创建它,如下所示:

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;
    }
}

最后截图:

Click here to show it

2 个答案:

答案 0 :(得分:0)

我发现了问题,你在搜索失败了......在代码中:

    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;
            }
        }
    }

您在datagridview中搜索数据N次,其中N是列表框中所选项目的数量...当然,因为您只在列表框中选择了一个项目,所以您将只循环一次并且当然,这将始终检查存储在datagridview中的第一条记录..在这种情况下只是&#34; John Doe&#34; ...结果是你永远不会用不同于第一条记录的数据来填充文本框datagridview中的行。

解决方案是迭代datagridview元素而不是选定的项目,并检查所选项目。

除此之外,我还有许多其他的推荐,可以概括为一个&#34;你必须更多地学习和练习&#34;。如果你想我可以给你一些提示,但我认为阅读一本好的编码书会做得更好。

答案 1 :(得分:0)

这是正确的程序...请注意,我删除了所有与您的需求无关的代码行...您可以自由重新插入它们,但请认为这可能毫无价值。

    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();              
            }
        }
    }