代码改变世界

工作总结

2009-05-21 09:30  观海看云  阅读(454)  评论(0编辑  收藏  举报

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、其他功能与系统提供的标准滚动条相似。
学生信息管理系统