zoukankan      html  css  js  c++  java
  • C#编程笔记(一)

          前段时间,帮朋友用C#做了一个小玩意儿,在开发过程中,发现很多用的着的东西,在网上都没有很好的解决方案,前前后后折腾了近一个月,总算是基本上完成了,在此整理下,权作以后再用到时复习之用。

          这个东西有点像星座性格测试那种的,只不过是要C/S的,安装到客户端上,所以做起来限制比较多。首先要有数据录入的功能,提供界面,用户要能向其中录入数据,比如星座测试一条一条的题目;然后要对每个题目,提出相应的反馈、建议;最后,录入完成了,用户还要能够有个界面对指定的数据库进行增删改查:前面是录入的功能。在用户性格测试的时候,要有窗口完成答题,并在提交后,查看测试的结果,有打分,有整体评价,并且对于那些答得不合适的,还有一些建议。

          接下来,我会按不同的模块,说一说我是怎么做的。

          (1)数据的存储

          由于没有数据库管理系统的支持,我选择XML来保存数据。所以,这一模块就是基本的XML的创建、添加、删除。

          (1.1)XML文件的新建

          我做的这个玩意儿,用的XML的数据格式比较固定,所以,新建XML文件的时候,大的结构就写死了,不希望,也不会发生改变:

    EmptyXmlDocumentCreate
     1                 this._fileName = fileName;
     2                 this._xDoc = new XmlDocument();
     3                 this._xDoc.LoadXml(
     4                     "<?xml version=\"1.0\" encoding=\"gb2312\" ?>" +
     5                         "<root>"+
     6                             "<Principles>" +
     7                             "</Principles>"+
     8                             "<Results>"+
     9                             "</Results>"+
    10                         "</root>"
    11                     );
    12                 try
    13                 {
    14                     this._xDoc.Save(fileName);
    15                 }
    16                 catch (Exception ex)
    17                 {
    18                     MessageBox.Show(ex.Message);
    19                 }

          (1.2)向XML文件中的指定位置添加节点

          这里要说的是,我要添加的节点的数据结构是<ID,Content,Suggestion>。再者,添加节点的时候,用在树上直接找的办法,比较笨,用xPath会好很多,可惜时间紧没学明白……

    addToXMLDocument
     1         public void addToXMLDocument(string id, string content, string suggestion)
     2         {
     3             XmlNode Term = this._xDoc.CreateNode(XmlNodeType.Element, "Term""");
     4 
     5             XmlElement ID = this._xDoc.CreateElement("ID");
     6             ID.InnerText = id;
     7             Term.AppendChild(ID);
     8 
     9             XmlElement Content = this._xDoc.CreateElement("Content");
    10             Content.InnerText = content;
    11             Term.AppendChild(Content);
    12 
    13             XmlElement Suggestion = this._xDoc.CreateElement("Suggestion");
    14             Suggestion.InnerText = suggestion;
    15             Term.AppendChild(Suggestion);
    16 
    17             this._xDoc.ChildNodes.Item(1).ChildNodes.Item(0).AppendChild(Term);
    18 
    19             try
    20             {
    21                 this._xDoc.Save(this._fileName);
    22             }
    23             catch (Exception ex)
    24             {
    25                 MessageBox.Show(ex.Message);
    26             }
    27         }

          (1.3)从XML文件中删除指定的节点

          在应用中,我是在ListView中把XML的数据打出来,通过勾选CheckBox选定删除的对象。

    DeleteNodeFromXmlDocument
     1         private void button4_Click(object sender, EventArgs e)
     2         {
     3             XmlDocument xDoc = new XmlDocument();
     4             xDoc.Load(this._fileName);
     5             foreach (ListViewItem lItem in Listview1.Items)
     6             {
     7                 if (lItem.Checked == true)
     8                 {
     9                     //int index = Convert.ToInt32(lItem.SubItems[1].Text, 10);
    10                     foreach (XmlNode xNode in xDoc.ChildNodes.Item(1).ChildNodes.Item(0).ChildNodes)
    11                     {
    12                         if (String.Compare(xNode.ChildNodes[0].InnerText, lItem.SubItems[1].Text) == 0)
    13                         {
    14                             xDoc.ChildNodes.Item(1).ChildNodes.Item(0).RemoveChild(xNode);
    15                         }
    16                     }
    17                     Listview1.Items.Remove(lItem);
    18                 }
    19             }
    20             xDoc.Save(this._fileName);
    21             Re_Load();
    22         }

          (2)动态界面生成

           这个算是我在第一阶段遇到的最大的一个问题。作为一个C#的菜鸟,习惯了拖拖拽拽弄出一个窗口界面,当被要求根据用户输入,动态生成界面的时候,直接歇菜了……

           在网上找了很多,可惜很多都不适用,忘记后来是在哪里找到的答案,向那位记不起名儿的童鞋致敬了。

           是这样的,所谓的动态生成,就是把原来在Form.Designer.cs中代码,搬到你自己的代码中去。比如,你原来在Form.Designer.cs中有这样的代码

    Example: Form.Designer.cs
    1             // 
    2             // button1
    3             // 
    4             this.button1.Location = new System.Drawing.Point(5797);
    5             this.button1.Name = "button1";
    6             this.button1.Size = new System.Drawing.Size(7523);
    7             this.button1.TabIndex = 0;
    8             this.button1.Text = "button1";
    9             this.button1.UseVisualStyleBackColor = true;

           你可以写到你自定义的Button2的Click事件中,这样,在你点击Button2后,就会在窗口上新加一个Button1出来

    Example: ButtonClick
     1         private void button2_Click(object sender, EventArgs e)
     2         {
     3             // 
     4             // button1
     5             // 
     6             this.button1.Location = new System.Drawing.Point(5797);
     7             this.button1.Name = "button1";
     8             this.button1.Size = new System.Drawing.Size(7523);
     9             this.button1.TabIndex = 0;
    10             this.button1.Text = "button1";
    11             this.button1.UseVisualStyleBackColor = true;
    12             this.Controls.Add(this.button1);
    13             this.ResumeLayout(false);
    14         }

           (2.1)说一说我自己做的那个东西,我设计如下:在Form中先放好一个大Panel,然后,根据用户输入,动态加入指定个数的组件Component。在每个Component里面,包含一个GroupBox,三个Label,三个TextBox,还有一些坐标的参数。

            要说一下,窃以为,动态加入组件,最麻烦的就是算坐标。那么多的东西,你需要事先把每个组件的坐标位置和大小都算好了,然后,你才可以保证你按下“添加”之后,你的组件能按照你想要的方式,呈现在窗口上。所以我对应每一条要添加的数据项,构造了上面的一个Component,然后给每个Component设置索引值,只要得到索引值,那么,这个Component的位置也就确定了。

            比较欣慰的是,这个组件的坐标是按相对位置计算的:你设置GroupBox的坐标时,你只要算好你在Panel中的位置就可以了,你不用管Panel在Form的哪里。同样,你的Label,TextBox只要算好在一个200*50的GroupBox中的位置就可以了,剩下的你就不用管了。或许是以前没有注意过这个问题,反正我觉得这一性质在我做的过程中,省了不少的事儿。

            这就完了么?No,还有一个我开始都没注意到的问题:最大化。对,你算的坐标是死的,当用户点击“最大化”按钮后,你的界面就会面目全非,所以,这里又要加入一个新的东西:TableLayoutPanel。Yes,需要把前面的那些写死的坐标,都放到这个TableLayoutPanel里面来,设置好每个组件的位置,这样,在“最大化”之后,依然能够保持良好的布局。

    Component
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Drawing;
    using System.Windows.Forms;

    namespace app01_Generate
    {
        
    class Component
        {
            
    #region 成员变量定义

            
    public static int OFFSET = 3;
            
    public static int HEIGHT = 98;
            
    private int _weight;
            
    private int _index;
            
    private GroupBox _gb;
            
    private Label _lb1, _lb2, _lb3;
            
    private TextBox _tb1, _tb2, _tb3;
            
    private TableLayoutPanel _tlp;

            
    #endregion

            
    public Component(int index,int weight)
            {
                
    this._index = index;
                
    this._weight = weight;

                
    this._gb = new GroupBox();
                
    this._gb.Location = new Point(3, OFFSET + this._index * HEIGHT);
                
    this._gb.Size = new System.Drawing.Size(this._weight, 92);
                
    this._gb.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                            
    | System.Windows.Forms.AnchorStyles.Right)));
                
                
    this._tlp = new TableLayoutPanel();
                
    this._tlp.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                            
    | System.Windows.Forms.AnchorStyles.Left)
                            
    | System.Windows.Forms.AnchorStyles.Right)));
                
    this._tlp.ColumnCount = 25;
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
                
    this._tlp.Location = new System.Drawing.Point(620);
                
    this._tlp.Name = "_tlp";
                
    this._tlp.RowCount = 1;
                
    this._tlp.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
                
    this._tlp.Size = new System.Drawing.Size(this._weight - 1266);

                
    this._lb1 = new Label();
                
    this._lb1.Anchor = ((System.Windows.Forms.AnchorStyles)(( System.Windows.Forms.AnchorStyles.Right)));
                
    this._lb1.AutoSize = true;
                
    this._tlp.SetColumnSpan(this._lb1, 2);
                
    this._lb1.Font = new System.Drawing.Font("微软雅黑"10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                
    this._lb1.Location = new System.Drawing.Point((int)((this._weight - 12* 8 / 741), 0);
                
    this._lb1.Name = "_lb1";
                
    this._lb1.Size = new System.Drawing.Size(4719);
                
    this._lb1.Text = "ID";


                
    this._lb2 = new Label();
                
    this._lb2.Anchor = ((System.Windows.Forms.AnchorStyles)(( System.Windows.Forms.AnchorStyles.Right)));
                
    this._lb2.AutoSize = true;
                
    this._tlp.SetColumnSpan(this._lb2, 2);
                
    this._lb2.Font = new System.Drawing.Font("微软雅黑"10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                
    this._lb2.Location = new System.Drawing.Point((int)((this._weight - 12* 124 / 741), 0);
                
    this._lb2.Name = "_lb2";
                
    this._lb2.Size = new System.Drawing.Size(4738);
                
    this._lb2.Text = "Content";

                
    this._lb3 = new Label();
                
    this._lb3.Anchor = ((System.Windows.Forms.AnchorStyles)(( System.Windows.Forms.AnchorStyles.Right)));
                
    this._lb3.AutoSize = true;
                
    this._tlp.SetColumnSpan(this._lb3, 2);
                
    this._lb3.Font = new System.Drawing.Font("微软雅黑"10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                
    this._lb3.Location = new System.Drawing.Point((int)((this._weight - 12* 501 / 741), 0);
                
    this._lb3.Name = "_lb3";
                
    this._lb3.Size = new System.Drawing.Size(4738);
                
    this._lb3.Text = "Suggestion";

                
    this._tb1 = new TextBox();
                
    this._tb1.Anchor = ((System.Windows.Forms.AnchorStyles)((( System.Windows.Forms.AnchorStyles.Left)
                
    | System.Windows.Forms.AnchorStyles.Right)));
                
    this._tlp.SetColumnSpan(this._tb1, 2);
                
    this._tb1.Font = new System.Drawing.Font("仿宋"10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                
    this._tb1.Location = new System.Drawing.Point((int)((this._weight - 12* 61 / 741), 3);
                
    this._tb1.Name = "_tb1";
                
    this._tb1.Size = new System.Drawing.Size(5229);

                
    this._tb2 = new TextBox();
                
    this._tb2.Anchor = ((System.Windows.Forms.AnchorStyles)((( System.Windows.Forms.AnchorStyles.Left)
                            
    | System.Windows.Forms.AnchorStyles.Right)));
                
    this._tlp.SetColumnSpan(this._tb2, 11);
                
    this._tb2.Font = new System.Drawing.Font("仿宋"10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                
    this._tb2.Location = new System.Drawing.Point((int)((this._weight - 12* 177 / 741), 3);
                
    this._tb2.Multiline = true;
                
    this._tb2.Name = "_tb2";
                
    this._tb2.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
                
    this._tb2.Size = new System.Drawing.Size(31348);

                
    this._tb3 = new TextBox();
                
    this._tb3.Anchor = ((System.Windows.Forms.AnchorStyles)((( System.Windows.Forms.AnchorStyles.Left)
                            
    | System.Windows.Forms.AnchorStyles.Right)));
                
    this._tlp.SetColumnSpan(this._tb3, 6);
                
    this._tb3.Font = new System.Drawing.Font("仿宋"10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                
    this._tb3.Location = new System.Drawing.Point((int)((this._weight - 12* 554 / 741), 3);
                
    this._tb3.Multiline = true;
                
    this._tb3.Name = "_tb3";
                
    this._tb3.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
                
    this._tb3.Size = new System.Drawing.Size(18448);

                
    this._tlp.Controls.Add(this._lb1, 00);
                
    this._tlp.Controls.Add(this._tb1, 20);
                
    this._tlp.Controls.Add(this._lb2, 40);
                
    this._tlp.Controls.Add(this._lb3, 170);
                
    this._tlp.Controls.Add(this._tb3, 190);
                
    this._tlp.Controls.Add(this._tb2, 60);
                
    this._gb.Controls.Add(this._tlp);

            }

            
    public void addToPanel(ref Panel pnl)
            {
                pnl.Controls.Add(
    this._gb);
            }

            
    public void Clear()
            {
                
    this._tb1.Clear();
                
    this._tb2.Clear();
                
    this._tb3.Clear();
            }

            
    public string getID()
            {
                
    return this._tb1.Text.Trim();
            }

            
    public string getContent()
            {
                
    return this._tb2.Text.Trim();
            }

            
    public string getSuggestion()
            {
                
    return this._tb3.Text.Trim();
            }

            
    public bool Check()
            {
                
    if (string.IsNullOrEmpty(this._tb1.Text.Trim()) == false ||
                    
    string.IsNullOrEmpty(this._tb2.Text.Trim()) == false ||
                    
    string.IsNullOrEmpty(this._tb3.Text.Trim()) == false
                    )
                    
    return false;
                
    else
                    
    return true;
            }

            
    public void Refresh(string id, string content, string suggestion)
            {
                
    this._tb1.Text = id;
                
    this._tb2.Text = content;
                
    this._tb3.Text = suggestion;
            }

        }
    }

            (3)ListView的使用

            不得不说,ListView真是个不错的东西,在显示数据和处理的时候,非常的简单实用。

            (3.1)ListView显示XML数据

            原理很简单,就是把XML中每个节点,填充到ListView的SubItem上。

    ListViewShowXMLDocument
     1         private void Re_Load()
     2         {
     3             this.Listview1.Columns.Clear();
     4             this.Listview1.Items.Clear();
     5             this.Listview1.Columns.Add(" "20, HorizontalAlignment.Left);
     6             this.Listview1.Columns.Add("ID"80, HorizontalAlignment.Left);
     7             this.Listview1.Columns.Add("Content", (int)((this.Listview1.Width - 80* 0.5), HorizontalAlignment.Left);
     8             this.Listview1.Columns.Add("Suggestion", (int)((this.Listview1.Width - 80* 0.3), HorizontalAlignment.Left);
     9             this.Listview1.ListViewItemSorter = new ListViewItemComparer(1);
    10 
    11             ListViewItem myItem = null;
    12             XmlDocument xDoc = new XmlDocument();
    13             xDoc.Load(this._fileName);
    14             XmlNode root = xDoc.ChildNodes.Item(1).ChildNodes.Item(0);
    15 
    16             foreach (XmlNode xNode in root.ChildNodes)
    17             {
    18                 myItem = new ListViewItem();
    19                 //myItem.SubItems.Add("");
    20                 myItem.SubItems.Add(xNode.ChildNodes[0].InnerText);
    21                 myItem.SubItems.Add(xNode.ChildNodes[1].InnerText);
    22                 myItem.SubItems.Add(xNode.ChildNodes[2].InnerText);
    23                 Listview1.Items.Add(myItem);
    24             }
    25             
    26         }

           (3.2)ListView的排序  

           注意到,上面设置了ListView的排序规则"this.Listview1.ListViewItemSorter = new ListViewItemComparer(1);",意思是:用ListViewItemComparer的一个对象,按ListView的第一列数据进行排序,就是按照ID进行排序。我是这儿考虑的,在XML文件里面,你对子节点按照ID进行排序,又麻烦,而且意义不是很大,干脆在呈现数据的时候,排一次序,这样看起来就非常齐整,不会因为用户的增加删除而乱序。

    ListViewItemComparer
     1         class ListViewItemComparer : IComparer
     2         {
     3             private int col;
     4             public ListViewItemComparer()
     5             {
     6                 col = 0;
     7             }
     8             public ListViewItemComparer(int column)
     9             {
    10                 col = column;
    11             }
    12             public int Compare(object x, object y)
    13             {
    14                 return Convert.ToInt32(((ListViewItem)x).SubItems[col].Text,10- Convert.ToInt32(((ListViewItem)y).SubItems[col].Text,10);
    15             }
    16         }

           (3.3)ListView的删除

           发现了ListView.CheckBoxes这个属性,设置为true之后,在每条数据的前面加上了一个CheckBox,实用这个东西还完成数据项的删除,同时映射后ListView绑定的XML文件数据删除。

    ListViewDeleteItem
     1             XmlDocument xDoc = new XmlDocument();
     2             xDoc.Load(this._fileName);
     3             foreach (ListViewItem lItem in Listview1.Items)
     4             {
     5                 if (lItem.Checked == true)
     6                 {
     7                     //int index = Convert.ToInt32(lItem.SubItems[1].Text, 10);
     8                     foreach (XmlNode xNode in xDoc.ChildNodes.Item(1).ChildNodes.Item(0).ChildNodes)
     9                     {
    10                         if (String.Compare(xNode.ChildNodes[0].InnerText, lItem.SubItems[1].Text) == 0)
    11                         {
    12                             xDoc.ChildNodes.Item(1).ChildNodes.Item(0).RemoveChild(xNode);
    13                         }
    14                     }
    15                     Listview1.Items.Remove(lItem);
    16                 }
    17             }
    18             xDoc.Save(this._fileName);
    19             Re_Load();

           可能,这些操作用DataGridView比较好,不过,时间有点急,DataGridView的东西有比较多,实在是没能吃下,用了下,比较吃力,还是暂时放弃了。

           (待续)

          

  • 相关阅读:
    Tensorflow中张量的数学运算
    TensorFlow2.0中tf.concat和tf.stack的区别
    机器学习之K-Means(聚类分析)
    机器学习之线性回归
    机器学习之随机森林
    机器学习之决策树
    python爬取FTP文件,并批量下载到本地。
    ATOM系列之-atom报错"Cannot load the system dictionary for zh-CN"
    开机出现loading (hd0)/ntldr。。。
    如何制作一张符合上传的照片
  • 原文地址:https://www.cnblogs.com/YFYkuner/p/1965324.html
Copyright © 2011-2022 走看看