• 工作总结


    Windows Forms DataGridView 没有提供合并单元格的功能,要实现合并单元格的功能就要在CellPainting事件中使用Graphics.DrawLine和 Graphics.DrawString 自己来“画”。
    下面的代码可以对DataGridView第1列内容相同的单元格进行合并:private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)        {            // 对第1列相同单元格进行合并            if (e.ColumnIndex == 0 && e.RowIndex != -1)            {                using                    (                    Brush gridBrush = new SolidBrush(this.dataGridView1.GridColor),                    backColorBrush = new SolidBrush(e.CellStyle.BackColor)                    )                {                    using (Pen gridLinePen = new Pen(gridBrush))                    {                        // 清除单元格                        e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
                            // 画 Grid 边线(仅画单元格的底边线和右边线)                        //   如果下一行和当前行的数据不同,则在当前的单元格画一条底边线                        if (e.RowIndex < dataGridView1.Rows.Count - 1 &&                        dataGridView1.Rows[e.RowIndex + 1].Cells[e.ColumnIndex].Value.ToString() !=                        e.Value.ToString())                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left,                            e.CellBounds.Bottom - 1, e.CellBounds.Right - 1,                            e.CellBounds.Bottom - 1);                        // 画右边线                        e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1,                            e.CellBounds.Top, e.CellBounds.Right - 1,                            e.CellBounds.Bottom);
                            // 画(填写)单元格内容,相同的内容的单元格只填写第一个                        if (e.Value != null)                        {                            if (e.RowIndex > 0 &&                            dataGridView1.Rows[e.RowIndex - 1].Cells[e.ColumnIndex].Value.ToString() ==                            e.Value.ToString())                            { }                            else                            {                                e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,                                    Brushes.Black, e.CellBounds.X + 2,                                    e.CellBounds.Y + 5, StringFormat.GenericDefault);                            }                        }                        e.Handled = true;                    }                }            }        }

    2007/3/25
    将textbox中的小写自动转换为大写
    第一种办法
    private   void   TextBox1_TextChanged(object   sender,   System.EventArgs   e)  
      {  
      TextBox1.Text=TextBox1.Text.ToUpper();  
      }  
    //自动将大写转变为小写:TextBox1.Text.ToLower();
    第二种办法
        在属性窗口把CharacterCasing属性设为Upper即可。
    第一种试过了,好用,第二种不知道在哪用。haha~
    ps:验证字符是数字还是字母的办法
       if ((s>='0'&&s<='9')||(s>='A'&&s<='Z')||(s>='a'&&s<='z'))
       {   }

    DataTable dt = ReadGridView();
    //this.GridView1.DataSource = dt;
    //this.GridView1.DataBind();
    DataRow row = dt.NewRow();
    row.ItemArray = new object[] { "oec2003","oec2003","oec2003" };
    dt.Rows.InsertAt(row, 0);
    dt.AcceptChanges();
    this.GridView1.DataSource = dt;
    this.GridView1.DataBind();

    --------------------------------------------------------------------------------

    如题,在文本框中输入字符时,如果输的是小写字母则直接显示大写字母。请问如何解决,谢谢。
    --------------------------------------------------------------------------------
    答:toupper()
    --------------------------------------------------------------------------------
    答:stringtest="a";if(((int)test.ToCharArray()[0])<97)MessageBox.Show(test.ToLower());elseMessageBox.Show(test.ToUpper());
    --------------------------------------------------------------------------------
    答:是指输入时[直接]显示大写,不显示小写么?分都不给,真不想回贴!
    privatevoidtextBox1_KeyPress(objectsender,KeyPressEventArgse){e.KeyChar=char.ToUpper(e.KeyChar);}

    在上课期间,本文不定期更新

    .Net2003可到信息中心网站的FTP站点下载:ftp://210.32.80.8/pub/

    ==================
    C#语言介绍
    ==================
    1.常用的数据类型
    (1)值类型:
    简单类型:bool,byte,int,long,char,float,double等
    枚举类型:enum
    结构类型
    (2)引用类型:string,类class,  接口interface, 数组, 委托delegate
    2.常量和变量
    3.表达式
    + - * / % ++ --
    >  >=  <  <=  ==  !=
    &&  ||  !
    =
    ?:
    new
    .  ()  []
    4.语句
    if
    switch
    while()
    do … while()
    for
    5.流程图
    ===================
    一些例子:
    ===================
    1、输入半径,点击按钮,输出面积。
    选择菜单:文件|新建|工程,选择存放程序的文件夹,
    自动生成一个新窗体。在窗体上放置2个文本框和一个按钮。
    双击按钮进入编程:

      private void button1_Click(object sender, System.EventArgs e)
      {
       double r,s;
       r = System.Convert.ToDouble(textBox1.Text);
       s = 3.14159 * r * r;
       textBox2.Text = System.Convert.ToString(s);
      }

    ===================
    2、计算(a+b)*(a-b)。
    方法:选择菜单:文件|新建|工程,产生设计窗体的界
    面,放置3个文本框,在文本框前放置3个label控件,
    设置它们的Text属性:
    三个文本框分别为“1”,“2”,空;
    三个标签分别为“a=”,“b=”,“值:”。
    放置一个按钮,设置按钮的Text属性为“计算”。
    鼠标双击按钮,进入编程:

      private void button1_Click(object sender, System.EventArgs e)
      {
       double a,b,s;
       a = System.Convert.ToDouble(textBox1.Text);
       b = System.Convert.ToDouble(textBox2.Text);
       s = (a+b)*(a-b);
       textBox3.Text = System.Convert.ToString(s);
      }

    如何对上面进行修改:计算a%b,a*(b-(a-b))等表达式的值。
    ==================
    if语句
    ==================
    (1)求两数的较大值
    方法:窗口上放置3个文本框,分别表示2个输入的数和输出结果。
    放置一个按钮,双击按钮进行编程:

      private void button1_Click(object sender, System.EventArgs e)
      {
       double a,b,m;
       a = System.Convert.ToDouble(textBox1.Text);
       b = System.Convert.ToDouble(textBox2.Text);
       if(a >= b)
        m = a;
       else
        m = b;
       textBox3.Text = System.Convert.ToString(m);
      }
    如何修改:求两数的较小值。
    ====================
    (2)输入成绩,输出等级。
    (3)输入密码,判断是否正确。
    (4)求三个数的较大值和较小值。
    ====================
    (1)MessageBox.Show() //显示消息框
    System.Windows.Forms.MessageBox.Show(System.Convert.ToString(m));  //m是数值
    (2)using //引用名字空间,出现在文件头部
    using System
    using System.Windows.Forms;
    (3)帮助系统的使用
    //用对话框显示信息内容、标题、按钮类型和图标类型,例:
    MessageBox.Show("要显示的信息", "窗口标题", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Error);
    ====================
    循环
    ====================
    例子:计算1+2+3+…+100的值。
    新建工程,在窗体上放上一个按钮,为该按钮添加代码:
      private void button1_Click(object sender, System.EventArgs e)
      {
       int i,s;
       for(i=1,s=0; i<=100; i++)
        s += i;
       MessageBox.Show(Convert.ToString(s));
      }
    ----------
    用 while() 循环改写:
       int i,s;
       i=1;
       s=0;
       while(i<=100)
       {
        s += i;
        i++;
       }
       MessageBox.Show(Convert.ToString(s));
    ----------
    用 do while() 改写:
       int i,s;
       i=1;
       s=0;
       do
       {
        s += i;
        i++;
       }while(i<=100);
       MessageBox.Show(Convert.ToString(s));
    ====================
    其他例子:
    1.求 1^2 + 2^2 + 3^2 + ... + 100^2
    2.计算全班总分和平均分。
    3.输入n个数,输出其中最大数。
    4.找出1个在1~1000中被7除余5、被5除余3、被3除余2的数。
    5.求 1-1/2+1/3-1/4+...+(-1)^(n-1)*1/n
    6.求斐波那契数列{1,1,2,3,...}的第n项(a(n)=a(n-2)+a(n-1))
    7.验证下列级数的收敛性:
    (1)1+1/2+1/3+...+1/n;(2)1+1/2^2+1/3^2+...+1/n^2
    8.输入一个整数,判断是否是素数。
    9.计算方程x^2+y^2+z^2=2000的所有正整数解。
    10.求n!。
    ====================
    更多思考题:
    1.水仙花数:abc = a^3 + b^3 + c^3
    2.是平方数的回文数:形如 12321 = ( )^2
    3.求n以内的所有素数。
    4.求最大公约数(辗转相除法)。
    5.因数分解:12 = 2*2*3
    6.完全数:6=1+2+3
    7.勾股数:3*3 + 4*4 = 5*5
    8.相邻奇数是素数。
    9.验证哥德巴赫猜想。
    10.验证费尔马大定理(网上查)。
    11.输入一个整数,然后
      (1)判断它是几位数;
      (2)输出指定位的数字;
      **(3)转换成中文表述。
    =====================
    数组:
    =====================
    例1:求斐波那契数列的第20项的值。答案为6765。
    不使用数组:
       int i, a, a1, a2;
       a1 = 1;
       a2 = 1;
       a = 0;
       for(i=3; i<=20; i++)
       {
        a = a1 + a2;
        a1 = a2;
        a2 = a;
       }
       MessageBox.Show(Convert.ToString(a));
    ---------------
    使用数组:
       int[] a = new int[21];
       int i;
       a[1] = 1;
       a[2] = 1;
       for(i=3; i<=20; i++)
       {
        a[i] = a[i-2] + a[i-1];
       }
       MessageBox.Show(Convert.ToString(a[20]));
    =====================
    其他题目:
    2.两向量相加。
    3.用筛选法求100以内素数。
    4.输入5个数,进行统计计算:sqr(((a1-E)^2+...+(an-E)^2)/n),E为平均值。
    二维数组:
    1.矩阵赋值。
    2.矩阵相加、相乘、求逆、转置、求行列式。
    3.求奇次幻方。
    4.求一个矩阵的n*n子矩阵的最大平方和。
    应用题:
    1.口算练习。(计算机自动出题,计时,训练速度。)
    **2.二十四点游戏。(计算机出4张扑克牌,人组合,计算机自动判断)
    3.研究偶次幻方的排列方法。
    =====================
    数组赋初值:
    int[] a = new int[] {0,1,2,3};
    int[] a = {0,1,2,3};
    int[,] a = new int[4,2];
    =====================
    函数:
    =====================
    int f(int x)
    =====================
    例:最简单的函数调用:
      private void button1_Click(object sender, System.EventArgs e)
      {
       MessageBox.Show(Convert.ToString(f(1)));
      }
      private int f(int x)
      {
       return 1;
      }
    =====================
    设计函数:
    1.已知 f(x)=x^3+2*x^2+3  (指数也可使用double Math.Pow(double x, double y))
    2.计算 (2!+3!+6!+8!)/10!,先编一个函数fact(n)用来求n!
    3.用函数求1~1000之间的素数。(开方:Math.Sqrt())
    =====================
    Windows常用控件:
    =====================
    介绍下列控件:
    文本框 TextBox
    标签 Label
    超链接标签 LinkLabel
    按钮 Button
    复选框 CheckBox
    单选按钮 RadioButton
    分组框 GroupBox
    面板 Panel
    列表框 等 ListBox、CheckedListBox、ComboBox、ListView、TreeView
    选项卡 TabControl
    滚动条 HScrollBar、VScrollBar
    时钟控件 Timer
    分割线 Splitter
    菜单 MainMenu
    图片框 PictureBox
    其他控件 ProgressBar、ImageList、ToolTip、ContextMenu、OpenFileDialog等
    ---------------------------
    常见属性:
    Text //显示的文本
    Font  //字体
    ForeColor  //前景色
    BackColor  //背景色
    Enabled  //可用情况
    Visible  //可见情况
    Dock //指示停靠到上一级容器的哪些边
    Left //左边界到容器工作区左边缘的距离(运行时设置/获取,设计时用Location)
    Top //上边界到容器工作区上边缘的距离(运行时设置/获取,设计时用Location)
    Right //右边界到容器工作区左边缘的距离(运行时只读)
    Bottom //下边界到容器工作区上边缘的距离(运行时只读)
    Height //控件的高度(运行时设置/获取,设计时用Size)
    Width //控件的宽度(运行时设置/获取,设计时用Size)
    ----------------------------
    常见事件:
    Click //鼠标点击控件时发生
    DoubleClick //鼠标双击控件时发生
    KeyPress //用户完成按键后(显示前)发生
    Enter //当控件成为该窗体的活动控件时发生(获取焦点)。
    Leave  //当控件不再是窗体的活动控件时发生(失去焦点)
    Paint //在重绘控件时发生
    Resize //在调整控件大小时发生
    ============================
    综合示例:设置一个窗口,放置一些控件,使得形成一个学生信息输入/修改窗口:
      修改窗口标题为“学生信息输修改”
      添加下列控件:
      标签“姓名:”
      文本框(txtName)
      两个按钮分别为:锁定(btnLock)、解锁(btnUnlock)
      一个复选框:团员
      一个分组框:性别
    分组框内添加两个单选按钮:男、女
    1、为两个按钮编程:锁定按钮使得文本框的Enabled属性为真,解锁反之。
    2、进一步添加代码使得锁定和解锁两个按钮也能在是否可操作间切换。
    3、将锁定和解锁按钮改为“隐藏”和“显示”,同时修改代码使得能隐藏
       和显示txtName文本框。
    4、添加一个标签(lblInfo),用于显示“我是男的。”和“我是女的。”信息,
       为两个性别单选按钮添加显示上面两种信息的代码。
    ============================
    1、文本框 TextBox
    (1)常用属性:
    Text //显示的文本
    ForeColor  //前景色
    例:textBox1.ForeColor = Color.Yellow;
    BackColor  //背景色
    Font  //字体
    例1:textBox1.Font = new Font("仿宋",9); //使用新的字体进行设置
    例2:鼠标点击按钮button1后,更改文本框的字体为斜体(在原字体的基础上修改字体类型):
      private void button1_Click(object sender, System.EventArgs e)
      {
       textBox1.Font=new Font(textBox1.Font,
          textBox1.Font.Style|FontStyle.Italic);
      }
    例3:鼠标点击按钮button1后,增大文本框的字体大小(Font参数与例1对照):
      private void button1_Click(object sender, System.EventArgs e)
      {
       textBox1.Font=new Font(textBox1.Font.FontFamily.ToString(),
          textBox1.Font.Size + 1);
      }

    BorderStyle  //边框类型
    Enabled  //可用情况
    Visible  //可见情况
    TextAlign //确定标签中文本的位置
    (2)特色属性:
    ScrollBars //滚动条
    Multiline  //多行文本
    PasswordChar  //密码显示字符
    ReadOnly  //只读
    (3)运行时常用属性:
    SelectedText //获取/替换被选择文字
    例:textBox1.SelectedText ="1"; //往文本框中插入文字“1”
    SelectionLength //获取/设置被选择文字长度
    SelectionStart //获取/设置被选择开始位置
    (4)常用方法:
    SelectAll() //选择全部
    Focus() //将控件设为焦点
    例1:程序运行时,用户点击按钮button1后,文本框textBox1获得焦点:
      private void button1_Click(object sender, System.EventArgs e)
      {
       textBox1.Focus();
      }
    例2:设置文本框textBox1为焦点,同时将第1个开始的1个字符选中:
      private void button1_Click(object sender, System.EventArgs e)
      {
       textBox1.Focus();
       textBox1.SelectionStart = 1;
       textBox1.SelectionLength = 1;
      }
    (5)常用事件:
    TextChanged //当Text属性被改变时发生
    KeyPress //用户完成按键后(显示前)发生
    例:在KeyPress事件中添加  e.Handled=true;  可使文本框不接收字符。
    Enter //当控件成为该窗体的活动控件时发生(获取焦点)。
    Leave  //当控件不再是窗体的活动控件时发生(失去焦点)

    思考:如何设计一个记事本的编辑界面?

    2、标签 Label
    (1)常用属性:
    Text //显示的文本
    ForeColor  //前景色
    BackColor  //背景色
    Font  //字体
    BorderStyle  //边框类型
    Enabled  //可用情况
    Visible  //可见情况
    TextAlign //确定标签中文本的位置
    (2)特色属性:
    AutoSize //根据字体大小自动调节大小(针对文本不换行的标签)

    3、按钮 Button
    (1)常用属性:
    Text //显示的文本
    ForeColor  //前景色
    BackColor  //背景色
    Font  //字体
    Enabled  //可用情况
    Visible  //可见情况
    (2)常用事件:
    Click //鼠标点击时发生

    4、复选框 CheckBox
    (1)常用属性:
    Checked //指示复选框是否选中
    CheckState //指示复选框的复选状态
    Text //显示的文本
    Enabled  //可用情况
    Visible  //可见情况
    (2)常用事件:
    CheckedChanged //更改Checked属性时发生

    5、单选按钮 RadioButton
    (1)常用属性:
    Checked //指示单选按钮是否已选中
    Text //显示的文本
    Enabled  //可用情况
    Visible  //可见情况
    (2)常用事件:
    CheckedChanged //更改Checked属性时发生

    6、分组框 GroupBox
    (1)常用属性:
    Text //显示的文本
    Enabled  //可用情况
    Visible  //可见情况
    Dock //指示停靠到上一级容器的哪些边

    7、面板 Panel
    (1)常用属性:
    BorderStyle //面板的边框类型
    Enabled  //可用情况
    Visible  //可见情况
    Dock //指示停靠到上一级容器的哪些边
    BackColor  //背景色
    AutoScroll //自动滚动

    8、时钟控件Timer
    (1)常用属性:
    Enabled  //可用情况
    Interval //触发的时间间隔(毫秒)
    (2)常用事件
    Tick //每隔一定的间隔时间发生

    例1:新建项目,在窗口上放置3个label控件,重命名为:lblHour、lblMinute、lblSecond;
    放置一个时钟控件。设置时钟控件的Enabled属性为true,设置Interval属性为1000。
    添加以下代码:
      int t = 0;  //特别注意此处的变量放在函数外面
      private void timer1_Tick(object sender, System.EventArgs e)
      {
       int h, m, s;
       t++;
       h = t / 3600;
       m = (t % 3600) / 60;
       s = t % 60;
       lblHour.Text = Convert.ToString(h);
       lblMinute.Text = Convert.ToString(m);
       lblSecond.Text = Convert.ToString(s);
      }
    修改例1:要求鼠标点击窗体后才开始计时。修改timer1的Enabled属性为false,
    然后为窗体添加Click事件:
    (注意此段代码添加的方法:点击窗口,在属性窗口选择双击事件)
      private void Form1_Click(object sender, System.EventArgs e)
      {
       timer1.Enabled = true;
      }
    思考:修改例1使得:点击“开始”按钮开始计时,点击“停止”按钮停止计时。

    例2:显示当前的系统时间。方法:操作同例1。为时间控件添加以下代码:
      private void timer1_Tick(object sender, System.EventArgs e)
      {
       DateTime t;  //DateTime是System下的一个数据类型(结构体)
       t = System.DateTime.Now;
       lblHour.Text = Convert.ToString(t.Hour);
       lblMinute.Text = Convert.ToString(t.Minute);
       lblSecond.Text = Convert.ToString(t.Second);
      }
    思考:修改例2,使得其还显示年月日和星期。

    例3:移动横幅标签:
      private void timer1_Tick(object sender, System.EventArgs e)
      {
       label1.Left = label1.Left - 5;
       if(label1.Right < 0)
        label1.Left = this.Width;
      }
    修改例3:使横幅左右交替移动:
      int k = 1;
      private void timer1_Tick(object sender, System.EventArgs e)
      {
       if(k==1) //表示正在左移
       {
        label1.Left = label1.Left - 5;
        if(label1.Left <= 0)
         k = 0;
       }
       else //表示正在右移
       {
        label1.Left = label1.Left + 5;
        if(label1.Right >= this.Width)
         k = 1;
       }
      }
    =====================
    9、滚动条 HScrollBar、VScrollBar
    (1)常用属性:
    Enabled //控件是否可用
    Visible //控件是否可见
    Maximum //滚动条的最大值(注意:滚动条的最大值不能通过运行时的用户交互而达到。
                            这个可以达到的最大值等于 Maximum 属性值减去
                            LargeChange 属性值加一ff。该最大值只能以编程方式达到。)
    Minimum //滚动条的最小值
    SmallChange //滚动条滚动时位置的最小变化值(点击在箭头上)
    LargeChange //滚动条滚动时位置的最大变化值(点击在滚动条空白区上)
    Value //滚动条当前指示的值
    (2)常用事件:
    Scroll //在滚动条滚动时发生
    例1:在窗体上放置一个水平滚动条,双击滚动条添加下面的事件代码:
      private void hScrollBar1_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
      {
       this.Text = hScrollBar1.Value.ToString();
      }
    运行程序,拖动滚动条,观看运行效果。

    例2:删除例1中的事件,添加滚动条的ValueChanged事件,添加例1相同的代码。
    看看与例1有什么不同的结果?(与系统有关)

    例3:利用三个滚动条和三个文本框编制一个简单的颜色编辑器。
    放置三个滚动条:hScrollRed、hScrollGreen、hScrollBlue,值的范围为0-255
    放置三个文本框:txtRed、txtGreen、txtBlue
    放置一个方形的标签:lblColor
    要求:滚动条拖动时,相应的文本框中的数值改变,同时标签颜色改变;
          文本框中的数值改变时(需要校验),滚动条指示的位置改变,同时标签颜色改变;
      private void hScrollRed_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
      {
       txtRed.Text = hScrollRed.Value.ToString();
       lblColor.BackColor = Color.FromArgb(hScrollRed.Value,
          hScrollGreen.Value, hScrollBlue.Value);
      }

      private void hScrollGreen_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
      {
       txtGreen.Text = hScrollGreen.Value.ToString();
       lblColor.BackColor = Color.FromArgb(hScrollRed.Value,
          hScrollGreen.Value, hScrollBlue.Value);
      }

      private void hScrollBlue_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
      {
       txtBlue.Text = hScrollBlue.Value.ToString();
       lblColor.BackColor = Color.FromArgb(hScrollRed.Value,
          hScrollGreen.Value, hScrollBlue.Value);
      }

      private void txtRed_TextChanged(object sender, System.EventArgs e)
      {
       hScrollRed.Value = Convert.ToInt32(txtRed.Text);
       lblColor.BackColor = Color.FromArgb(hScrollRed.Value,
          hScrollGreen.Value, hScrollBlue.Value);
      }

      private void txtGreen_TextChanged(object sender, System.EventArgs e)
      {
       hScrollGreen.Value = Convert.ToInt32(txtGreen.Text);
       lblColor.BackColor = Color.FromArgb(hScrollRed.Value,
          hScrollGreen.Value, hScrollBlue.Value);
      }

      private void txtBlue_TextChanged(object sender, System.EventArgs e)
      {
       hScrollBlue.Value = Convert.ToInt32(txtBlue.Text);
       lblColor.BackColor = Color.FromArgb(hScrollRed.Value,
          hScrollGreen.Value, hScrollBlue.Value);
      }
    =====================
    10、MainMenu 主菜单控件
    (1)编辑窍门:
    快捷键:&+字母,例:&F
    菜单子项目分割线:设置Text属性为“-”
    设置快捷方式:设置Shortcut属性
    显示快捷方式:设置ShowShortcut属性为true(默认值为true)
    为菜单项目编程:用鼠标双击菜单项
    在菜单项前面打钩:设置Checked属性为true
    让菜单项变成不可用:设置Enabled属性为false
    让菜单项不可见:设置Visible属性为false
    (2)示例(记事本):
    第一步:新建项目,在窗体上放置文本框,设置文本框属性,使得它:多行、不自动回行、具有水平和垂直两个滚动条、充满整个窗体、文本框内容初始为空。
    第二步:在窗体上放置主菜单控件MainMenu,参照记事本的菜单输入菜单项的文本、快捷键和快捷方式。
    第三步:为文本框和菜单项添加必要的事件代码。
    =====================
    11、分割线 Splitter
    选择技巧:在属性栏上面的下列列表框内找。
    常用属性:Size //大小:宽度和高度可以分别设置

    =====================
    12、画图
    例:在窗体内放置一个图片框,改名为pic,添加按钮,为按钮添加以下代码
    Graphics p = pic.CreateGraphics();
    p.DrawLine(new Pen(Color.Blue, 5), new Point(20,20), new Point(80,80));
    解释:第一行建立一个图层,第二行在图层上画图。
    常用画图时用到的参数:笔Pen,坐标Point、刷子Brush。
    刷子Brush:这是一个抽象基类,不能进行实例化。若要创建一个画笔对象,请使用从 Brush 派生出的类,如 SolidBrush、TextureBrush 和 LinearGradientBrush。
    =====================
    13、列表框 ListBox
    (1)列表框内的对象Items:
    用法:<列表框名称>.Items //列表框内项的集合
    (2)列表框的特殊属性:
    SelectedIndex //当前所选的项的索引号(从0开始,没有选择返回-1)
    SelectedItem //获取或设置当前选定项
    Text //获取当前选定项的文本
    其他特殊属性大多可以在设计时进行设置(见设计界面列表框的行为类别的属性)
    (3)列表框的常用方法:
    SetSelected //选择或不选列表框中的某一项
    (4)列表框的常用事件:
    参见设计界面列表框的事件列表。
    (5)项的集合Items的属性:
    Count //取出集合中项的数目
    (6)项的集合Items的方法:
    Add //添加项
    Clear //清除所有项
    IndexOf //返回项的索引(用于搜索)
    Insert //将项插入指定索引处
    RemoveAt //移除制定索引的项
    例1:在窗体上放置一个列表框(listBox1)、一个文本框(textBox1)、一个按钮。为按钮点击事件添加如下一行代码:
    listBox1.Items.Add(textBox1.Text);
    运行效果:每次点击按钮,将文本框内容添加到列表框中。
    例2:在例1的基础上,再添加一个按钮,为这个按钮点击事件添加如下一行代码:
    listBox1.Items.RemoveAt(listBox1.SelectedIndex);
    运行效果:每次点击按钮,将列表框内所选的项目删除。
    ======================


    过程:
    一、什么是对象?
    1、三个相关概念:属性、方法、事件。
    2、窗体代码的查看:
    (1)窗体类定义方式。
    (2)窗体类内代码分为两部分:变量声明、函数定义。
    (3)特殊函数:构造函数,析构函数,应用程序启动函数。
    二、多窗体(非子窗体)编程
    例1:创建新的项目,默认生成一个窗体Form1,在Form1上放置一个按钮buttonBox1,在“解决方案资源管理器”中添加新的窗体Form2。为Form1的按钮button1的Click事件添加以下代码:
      private void button1_Click(object sender, System.EventArgs e)
      {
       (new Form2()).Show();
      }
    运行效果:用鼠标点击按钮button1,出现窗体Form2,关掉Form2后,再次点击按钮,窗体再次出现。
    意外:用鼠标连续多次点击按钮,出现多个Form2窗体。
    原因:每次执行代码(new Form2())都会产生一个新的Form2类型的窗体,而每次建立的Form2类型的窗体没有名称,因此难以被再次利用。
    例2:对例1进行修改:在窗体Form1中再添加的按钮button2,在Form1的变量声明区添加一个变量:
      private Form frmMy;
    再为两个按钮的Click事件添加以下代码:
      private void button1_Click(object sender, System.EventArgs e)
      {
       frmMy = new Form2();
       frmMy.Show();
      }

      private void button2_Click(object sender, System.EventArgs e)
      {
       frmMy.Close();
      }
    运行效果:点击按钮button1出现窗体Form2,点击按钮button2则关闭窗体Form2。
    意外:多次点击button1后出现多个Form2,点击按钮button2只能关闭最后一个打开的窗体。
    原因:变量frmMy只保存最后一次的窗体。

    利用多窗体(非子窗体)编程的内容有:
    自定义对话框的设计:关于窗体、参数选项窗体、欢迎窗体、进度显示窗体等。
    --------------------------------
    一些技巧:
    1、如何操作另一窗体内的控件;
    2、如何多次打开同一窗体,而内容不被更新;
    3、如何在打开新窗体时,让新窗体显示一定的信息,如:在主窗体的文本框中输入“张三”,点击按钮后弹出新窗体显示“张三你好!”;
    4、如何获取新窗体中的信息,如:点击主窗体上的按钮,弹出新窗体,在新窗体中接受用户的输入,然后主窗体的代码获取用户的输入。

    -----------------------------
    为窗体添加额外变量:
    例3:存在两个窗体:Form1和Form2。在窗体Form2的变量声明区添加一个变量:
      private int n = 0;
    在Form2的Click事件中添加代码:
      private void Form2_Click(object sender, System.EventArgs e)
      {
       n ++ ;
      }
    判断以下试验哪种方式是正确的:
    (1)在Form1中以Form2.n的方式获取窗体Form2被点击的次数;
    (2)在Form1中以其他的方式获取窗体Form2被点击的次数;
    (3)在Form1中根本无法获取窗体Form2被点击的次数。

    ===========================

    三、类的使用
    ------------------------
    实例步骤:
    (1)新建项目,出现默认窗体Form1,修改窗体标题为“学生信息管理系统”;
    (2)在“解决方案资源管理器”的项目名称上单击右键,选择菜单“添加|添加类”,
         将文件名称改为“CStudent.cs”;
    (3)为CStudent添加以下代码:

     public class CStudent
     {
      public int XuHao; //代表在班级中的序号
      public string Name; //存放姓名
      public string XingBie; //存放性别“男”或“女”

      public CStudent()
      {
       //
       // TODO: 在此处添加构造函数逻辑
       //
       XuHao = 0;  //表示没有编号
       Name = "无名氏";
       XingBie = "男";
      }

      public CStudent(int xuhao, string name, string xingbie)
      {
       XuHao = xuhao;
       Name = name;
       XingBie = xingbie;
      }
     }

    (4)试验1:在窗体Form1添加三个标签,分别显示为“序号:”、“姓名:”、
       “性别:”;添加三个文本框,默认显示分别为“1”、空、空;上面标签
        和文本框相对应,成竖排;在第一个文本框右边添加一个按钮,显示为
       “查询”,在第三个文本框右边添加一个按钮,显示为“保存”。所有的
       名称为默认。然后在窗口代码的变量声明区添加:

      CStudent s = new CStudent(); //建立一个默认学生信息

       接着为“查询”和“保存”按钮分别添加鼠标单击事件:

      private void button1_Click(object sender, System.EventArgs e)
      {
       textBox1.Text = s.XuHao.ToString();
       textBox2.Text = s.Name;
       textBox3.Text = s.XingBie;
      }

      private void button2_Click(object sender, System.EventArgs e)
      {
       s.XuHao = Convert.ToInt32(textBox1.Text); //保存序号
       s.Name = textBox2.Text;  //保存姓名
       s.XingBie = textBox3.Text; //保存性别
       textBox1.Clear();  //清除显示
       textBox2.Clear();
       textBox3.Clear();
      }

    运行:输入序号、姓名、性别,点击“保存”,然后点击查询。多次试验,观察结果。
    注意:运行时,序号不能输错,否则程序出错。
    结论:可以保存、修改这位学生的信息。但只能保存一位学生的信息。
    ------------------------------
    扩展功能步骤:
    清除上述(4)中添加的变量和代码。
    (1)添加新的类,类文件名命名为“CAll.cs”,为它添加以下代码:
     public class CAll
     {
      int MaxN = 100; //最大人数
      int N; //当前班级人数
      CStudent[] Student; //存放全班学生信息

      public CAll()
      {
       //
       // TODO: 在此处添加构造函数逻辑
       //
       N = MaxN; //如果没有约定人数,就默认为最大人数
       InitAll();  //初始化全部学生
      }
      
      public CAll(int n)
      {
       if(n>0 && n<=MaxN)
        N = n;
       else
        N = MaxN;
       InitAll();
      }

      private void InitAll() //初始化全部学生
      {
       Student = new CStudent[N]; //分配 N 个存放 CStudent 的空间
       int n;
       for(n=0; n<N; n++) //为每个学生创建信息
       {
        Student[n] = new CStudent(); //为第 n 个学生创建信息
        Student[n].XuHao = n + 1;
       }
      }

      public string GetName(int n) //获取序号为 n 的学生姓名
      {
       if(n>0 && n<=N)
        return Student[n-1].Name;
       else
        return "不存在";
      }

      public string GetXB(int n) //获取序号为 n 的学生性别
      {
       if(n>0 && n<=N)
        return Student[n-1].XingBie;
       else
        return "无";
      }

      public void SetName(int n, string name) //设置序号为 n 的学生姓名
      {
       if(n>0 && n<=N)
        Student[n-1].Name = name;
      }

      public void SetXB(int n, string xb) //设置序号为 n 的学生性别
      {
       if(n>0 && n<=N)
        Student[n-1].XingBie = xb;
      }

      public int GetN() //获取全班人数
      {
       return N;
      }
     }

    (2)在Form1窗体添加窗体变量:

      CAll s = new CAll(50); //建立一个50人的班级

    (3)重新为Form1的“查询”和“保存”按钮添加鼠标点击事件:
      private void button1_Click(object sender, System.EventArgs e)
      {
       int n = Convert.ToInt32(textBox1.Text);
       textBox2.Text = s.GetName(n);
       textBox3.Text = s.GetXB(n);
      }

      private void button2_Click(object sender, System.EventArgs e)
      {
       int n = Convert.ToInt32(textBox1.Text);
       s.SetName(n, textBox2.Text);
       s.SetXB(n, textBox3.Text);
      }

    运行:输入序号、姓名、性别,点击“保存”,然后修改序号、姓名、性别后
         再次保存,如此多遍操作。然后输入序号后点击查询,查看显示结果。
    注意:运行时,序号不能输入非数字,否则程序出错。但输入超出范围的序号
         不会出错。
    结论:可以保存、修改、显示全班学生的信息。两个类相对不容易出错。信息
         不够直观,这是Form1的设计问题。
    ----------------------------
    用户自定义类的一个重要用途:存放和处理数据,显示方式由窗体提供。修改
                              显示方式不涉及到数据的存放和处理,即不需
                              改变类,只需改变窗体就可得到不同的界面。
    ----------------------------
    扩展功能步骤:
    在上面的基础上,进行以下步骤:
    (1)在窗体Form1上添加一个按钮,显示名称为“显示全班”,再添加一个列表框。
    (2)为“显示全班”按钮添加鼠标点击事件代码:

      private void button3_Click(object sender, System.EventArgs e)
      {
       int n;
       listBox1.Items.Clear();
       for(n=1;n<=s.GetN();n++)
       {
        listBox1.Items.Add(n.ToString() + " " + s.GetName(n) + "(" + s.GetXB(n) + ")"); 
       }
      }

    运行:以上例中运行的方式修改和保存信息,然后点击“显示全班”按钮,
          重复多遍。
    结论:不同的显示方式靠窗体编程,用户自定义的类用来存放核心数据和
          处理方法。
    思考:如何进一步修改,使之达到实用程度。如:显示得更完美,修改更
          方便,保存到文件中。
    注意:以上的控件名称都采用了系统默认的名称,像textBox1、textBox2、
          button1等,如何改名使之更合理,但改名必须在添加事件前进行。

    ===========================
    第五部分 文件处理及其他
    一、文件操作的基本概念
    二、文本信息的保存
    例1:新建工程,在窗体上放置一个按钮。为按钮添加鼠标点击事件:
      private void button1_Click(object sender, System.EventArgs e)
      {
       string Filename = @"C:\test.txt";
       StreamWriter sw = new StreamWriter(Filename);
       // 向文件写入文字
       sw.Write("This is the ");
       sw.WriteLine("header for the file.");
       sw.WriteLine("-------------------");
       // 对象表达的信息也能写入到文件中
       sw.Write("The date is: ");
       sw.WriteLine(DateTime.Now);
       sw.Close();
       MessageBox.Show("已经保存到" + Filename);
      }
    运行:点击按钮,然后退出。
    观察:打开C:\test.txt,看其中的格式,和程序对照。

    例2:继续例1的步骤,在窗体上放置控件SaveFileDialog,为修改例1代码为:
      private void button1_Click(object sender, System.EventArgs e)
      {
       string Filename = @"C:\test.txt";
       saveFileDialog1.ShowDialog();
       if(saveFileDialog1.FileName == "")
       {
        return;
       }
       StreamWriter sw = new StreamWriter(Filename);
       // 向文件写入文字
       sw.Write("This is the ");
       sw.WriteLine("header for the file.");
       sw.WriteLine("-------------------");
       // 对象表达的信息也能写入到文件中
       sw.Write("The date is: ");
       sw.WriteLine(DateTime.Now);
       sw.Close();
      }
    意义:结合存盘对话框进行保存文件。

    ===========================
    可编的练习程序:
    记事本
    字体设置演示
    颜色编辑器
    活动字幕
    电子时钟
    装载和复制图片
    号码摇奖程序
    背单词程序
    猜数游戏
    设计自定义滚动条控件,提供功能:1、用户交互可以达到最大值;
                                 2、其他功能与系统提供的标准滚动条相似。
    学生信息管理系统


     

    作者:wpf之家
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    会计继续教育
    免费看电影、电视剧的app
    微信开发者工具 测试过程的小助手
    2022年目标
    基于.Net6.0开发WebApi(一) —— 搭建项目框架
    asp.net中的省市区联动封装成用户控件
    uniapp文件下载
    Axure中动态表格序号自增中继器应用方法2
    JSinDeep1:探索执行环境 (Execution Context)ES3篇
    美国知名天使投资人列出愿意投资的30大创意方向
  • 原文地址:https://www.cnblogs.com/wpf123/p/2347471.html
Copyright © 2020-2023  润新知