zoukankan      html  css  js  c++  java
  • 工作总结

    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之家
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    KnockoutJS 3.X API 第五章 高级应用(4) 自定义处理逻辑
    KnockoutJS 3.X API 第五章 高级应用(3) 虚拟元素绑定
    KnockoutJS 3.X API 第五章 高级应用(2) 控制后代绑定
    KnockoutJS 3.X API 第五章 高级应用(1) 创建自定义绑定
    KnockoutJS 3.X API 第四章(14) 绑定语法细节
    KnockoutJS 3.X API 第四章(13) template绑定
    KnockoutJS 3.X API 第四章 表单绑定(12) selectedOptions、uniqueName绑定
    KnockoutJS 3.X API 第四章 表单绑定(11) options绑定
    KnockoutJS 3.X API 第四章 表单绑定(10) textInput、hasFocus、checked绑定
    KnockoutJS 3.X API 第四章 表单绑定(9) value绑定
  • 原文地址:https://www.cnblogs.com/wpf123/p/2347471.html
Copyright © 2011-2022 走看看