一个小小的C/S软件其实设计到的东西不是很多,我想大致有以下几个方面。涉及到的问题有:循环遍历的大量使用;对话框的多次打开;多窗体的打开;某一控件的各种事件的实现~~
一, 软件中最常见的就是循环和遍历的用法, 实现遍历很容易,所以学习中重要的是注意以下都是什么地方需要遍历。一般是在需要查找某个元素,或是存储的某信息包括若干字段的时候,或是需要调用数据中的许多字段重新存储的时候,更比如说需要元素之间排序或是比较的时候,就会用到遍历,初学的时候往往会在某些细节上忽略掉这些……
比如把一个含有数据的xml表导入或导出系统的时候就是一个十分典型的例子,见下面代码:
private void 导入ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Hide();
if(diaFile.ShowDialog()==DialogResult.OK)
{
if (diaFile.OpenFile()!= null)
{
twoXML.ReadXml(@diaFile.FileName);
foreach(DataRow twoRow in twoXML.Tables["UserKey"].Rows)
{
DataRow newRow = dsXML.Tables["UserKey"].NewRow();
newRow["Number"] = twoRow["Number"];
newRow["Title"] = twoRow["Title"];
newRow["NetAdd"] = twoRow["NetAdd"];
newRow["Name"] = twoRow["Name"];
newRow["Key"] = twoRow["Key"];
newRow["UpDateTime"] = twoRow["UpDateTime"];
dsXML.Tables["UserKey"].Rows.Add(newRow);
}
int n = dsXML.Tables["UserKey"].Rows.Count;
for (int i = 0; i < n; i++)
{
dsXML.Tables["UserKey"].Rows[i]["Number"] = i + 1;
}
dsXML.WriteXml(@"UserKey.xml");
this.Visible = true;
MessageBox.Show("XML文件导入成功!", "小侠提醒您:");
}
}
else
{
this.Visible=true;
}
}
这里出现了两个,一个foreach遍历,后面又一个for循环实现遍历,第一个foreach实现了各个字段的转储,后面的for循环主要是实现排序问题,因为他设计到了每一个数据项。
二,C/S架构中单击双击事件实现功能强大,比如如何实现的超链接功能,触发事件复制,剪切功能?
这个很简单,是用到的一个触发事件,单击需要操作的单元格,然后再解决方案上面的图标里单击事件,就会看到许多和它相关的时间,十分方便。就可以方便的找到一个name_CellDoubleClick()的事件,双击即可进入编码,在这里还可以实现比如我们这个时候需要对datagridview中cell中的网址进行双击打开网页,这个时候需要用在线程中启动一个start()如下:
private void dgUserKey_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
if (dgUserKey.Columns[e.ColumnIndex].HeaderText == "网址")
{
string url = dgUserKey.CurrentCell.Value.ToString(); //把当前cell中的值赋给url
System.Diagnostics.Process.Start(url); //启动url
ShowInf showForm = new ShowInf("正在打开窗体,请等候…"); //弹出对话框提示
showForm.Show(); //显示对话框
return; //这个时候就可以双击后就可以自动进入浏览器界面打开网页了
……
}
}
而复制功能的实现完全和上面一样,连过程都很相似,显示当前值重新赋值,然后启动调用,可以用粘贴板clipboard中的属性实现如下:
if (dgUserKey.Columns[e.ColumnIndex].HeaderText == "用户名")
{
string name = dgUserKey.CurrentCell.Value.ToString();
Clipboard.SetText(name);
……
这说明编程也是很人性化的思路,我想掌握住这个规律对自己的自学能力肯定很有帮助。
三,至于工具栏和右键菜单都是功能性的重复,这个时候可以省掉许多代码,将原功能方法名直接复制过来,然后把传递参数的方式就可以实现,非常简单便捷,比如上面的导入功能在工具栏里相应图标的单击或是双击事件里就可以加入:
private void toolStripButton1_Click(object sender, EventArgs e)
{
导入ToolStripMenuItem_Click(sender, e); //把相应的object和eventargs去掉,参数e,sender传送,相当于sender被e了
}
四,页面调用问题,就是从一个窗体上去调用另一个窗体的时候,常见两种情况:一是无参的,可以直接建立对象然后打开对象即可,如:PinTu pinTu = new PinTu(); 然后pinTu.ShowDialog();即可,如果有数据传递,就需要做一些调整,把参数传递过来。比如主界面打开一个修改对话框的时候:
private void 修改ToolStripMenuItem_Click(object sender, EventArgs e)
{
int n = dgUserKey.CurrentRow.Index; //当前数据表索引
this.dgUserKey.CurrentCell = dgUserKey[0, n];
string id = dgUserKey.CurrentCell.Value.ToString(); //当前cell值
KeyChange keyChange = new KeyChange(id,dsXML); //注意这里就用到了两个参数id和dsxml
keyChange.ShowDialog(); //可以打开修改界面了
}
五,菜单栏里各种图标的添加都是通过标签属性中的image来直接实现,虽然简单挺花时间的,窗体皮肤是通过skinengine控件实现的,右下角的图标显示比如QQ等右下角图标都是通过notifyicon控件实现的,可以通过它的name_MouseDown()事件来单击显示常用菜单,都很简单,就不记录。
六,总之,美工多是属性、控件等,代码多用到事件、触发等。