1.在做多文档窗体MDI中多个界面切换用到的技术
不用复杂的if else 判断,下面的技术可以化繁为简:
private void tsbMemberConsume_click(object sender,EventArgs e)
{
foreach(Form form in Application.openForms)
{
if(form.Name=="FormName")
//managerForm.WindowState = FormWindowState.Maximized;
form.Active();
return;
}
//for循环中的Application.openForms的意思是获取应用程序中打开窗体的集合。如果一个窗体还没有被打开,那么这个集合中就不会有他,那么执行下面的操作,如果已经打开了,让这个窗体获得激活,并return不在创建。
FormName form=new FormName();
form.MdiParent=this;
form.show();
}
2.MDI多文档窗体是否可以每次都打开一个窗体呢?
3.关于关闭窗体时弹出对话框:
(1)关闭总的关闭按钮
DialogResult result = MessageBox.Show("确定要关闭窗口?", "提示窗口", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
if (result == DialogResult.OK)
{
e.Cancel = false;
}
if(result==DialogResult.Cancel)
{
e.Cancel = true;
}
(2)关闭某一个按钮
private void toolStripButton1_Click(object sender, EventArgs e)
{
DialogResult result = MessageBox.Show("确定要关闭窗口?", "提示窗口", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
if (result == DialogResult.OK)
{
this.Dispose();
this.Close();
}
if (result == DialogResult.Cancel)
{
return;
}
}
4,一些GridView的属性
(1)RowHeadersVisible:指示是否显示行的标题。
(2)ScrollBars:滚动条的类型.
(3)选择一个单元格=选择一行的属性:SelectionMode:FullRowSelect
5。对于父窗体上多个子窗体的布局可以这样:
private void tsbMemberConsume_Click(object sender, EventArgs e)
{
foreach (Form form in Application.OpenForms)
{
if (form.Name == "MemberConsume")
{
pnlTemp.Controls.Add(form);
form.BringToFront();
return;
}
}
memberConsumeForm = new MemberConsume();
memberConsumeForm.WindowState = FormWindowState.Maximized;
memberConsumeForm.TopLevel = false;
pnlTemp.Controls.Add(memberConsumeForm);
memberConsumeForm.Show();
}
6.两个窗体,点击第一个窗体的按钮,弹出模式窗体,保存,第一个窗体的dateGridView刷新。
(1)把第二个窗体的保存和取消按钮的DialoResult分别设置成OK和Cancel
(2)在子窗体写代码
(3)在父窗体写代码
WareSortAdd wareSortAdd = new WareSortAdd();
if (wareSortAdd.ShowDialog() == DialogResult.OK)
{
GetTable();
}
//查询表中的数据
public void GetTable()
{
string sql = "select * from wareSort";
DataTable dt = WareManager.SelectWareSort(sql);
this.dgvWareSort.DataSource = dt;
}
7窗体间传值技术
8.WinForms中的Combox绑定DateTable的问题:
combox的SelectedIndexChanged事件,在datasouce指定的时候就被触发了,这时候数据还没有绑定好,自然会报错.
我认为这是不合理的.SelectedIndexChanged不应该在绑定数据的中间被触发.
我最后解决办法是设置了一个标志符isLoaded,bool类型,在填充方法完毕后,设为true.允许SelectedIndexChanged被触发.
代码如下:
/// <summary>
/// 绑定cmbdoc数据的方法
/// </summary>
private void FillCmbDoc()
{
//新建文档类的集合
Class.ClassDocCollection items1 = new DocAddin.Class.ClassDocCollection();
//提取所有文档数据,填充到集合
items1.FillInAllDoc();
cmbDoc.DataSource = items1;
cmbDoc.DisplayMember = "S名称";
cmbDoc.ValueMember = "I编号";
//设置标志符,true说明该combox已经绑定好了,允许SelectedIndexChanged事件被触发了.
isLoaded = true;
}
9.在窗体1中点击按钮弹出一个模式窗体2,然后点击窗体2中的保存按钮,如果保存成功,关闭模式窗体,同时刷新DataGriedView,如果保存失败,保持模式窗体:
(1)在窗体2中,把保存按钮的可访问性设置为public,它的Click事件这么写:
public void Click()
{
int num=操作数据库的代码
if(num>0)
{
保存按钮.tag="OK";
this.Close();
}
}
public void 窗体1的Click()
{
窗体2.showDialog();
if(窗体2.保存按钮.tag=="OK")
{
刷新DataGridView的代码;
}
}
10.下拉列表Combox的属性:DropDownStyle决定下拉框是否可以输入。
11.用打开文件控件,打开一个图片文件,为界面的控件设置与该图片的关系:
(1)首先是拖入一个打开文件的控件:openFileDialog1
(2)然后在按钮的点击按钮中写入相应的事件:
DialogResult result=this.openFileDialog();
if(result==DialogResult.OK)
{
string fileName=this.openFileDialog1.FileName;//对话框选中哪个文件,这个对话框就会包含该文件的字符串名。
try{
this.pictrueBox1.BackgroundImage=Image.FromFile(fileName);//从指定的文件中创建Image.
}catch{return;}
}
12.窗体的样式:
ControlBox:可以控制窗体是否可以有控件/菜单栏