工作总结
2009-05-21 09:30 观海看云 阅读(458) 评论(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、其他功能与系统提供的标准滚动条相似。
学生信息管理系统
出处:http://www.cnblogs.com/zhangtao/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。