使用美化方法设计嵌入的子窗体
分析效果图的实现
效果图:
新建 Windows 窗体
- 新窗体命名:FrmAddProduct.cs
- 修改窗体的 Text 属性:新增商品
- 修改窗体的位置:StartPosition:CenterScreen
- 窗体的无边框设计:FormBorderStyle:none
- 修改窗体的大小:Size:1047*640(尽量先设置无边框再设置大小,因为去边框会影响窗体大小)
- 修改窗体的背景颜色:BackColor:#EEFEFF
处理上半部分
- 拖拽一个 Label,设置 Text 属性:当前位置:新增商品;Font 属性:微软雅黑;
- 拖拽一个 Label,删除 Text 属性;AutoSize 属性:false;添加边框 BorderStyle 属性:Fixed3D;设置大小 Size:1047*1
- 保存到数据库按钮
- 关闭窗口按钮
基本信息
其他常见控件的使用自行设计,这里直接跳过了。
下拉列表框有两种实现方式:ListView 和 Combobox
请从分类列表中选择:ListView
- 复制一个上面制作好的按钮,修改 Text:请从分类列表中选择;修改背景颜色 BackColor:#0099DC;
- 点击按钮出现下拉列表:拖拽一个 Panel 调整大小放到按钮的下面
- 再拖拽一个 ListView(其实一个它也行,但有时候想再放些其他内容,所以上面拖拽了个容器 Panel)放到 Panel 上;调整 Dock 属性:fill;
ps:Panel 如果有一部分超出 GroupBox 被裁剪切割掉的话怎么处理:
单独把 Panel(包含 ListView)放到 GroupBox 外面,不让它成为 GroupBox 的子控件;然后把 GroupBox 先移到其它地方。这个时候,把 Panel(包含 ListView) 放到刚才想放到的地方,再把 GroupBox 移回去。这个时候会发现,Panel(包含 ListView) 被 GroupBox 盖住了,右键选择 GroupBox:置为底层 就可以了。
下拉列表框:Combobox
- 拖拽一个 ComboBox 控件,修改 DropDownStyle 属性:DropDownList(这个只能选择不能输入,DropDown 既能输入又能下拉选择);FlatStyle:Flat;设置背景色 BackColor:#00AEC2(如果设置完之后可能只显示一圈的背景色,像边框一样,没关系,运行的时候就好了。或者切换下 DropDownStyle 属性 也能正常显示背景色了);
其他窗口布局自行实现。
ListView 具体实现
先选中 ListView 的 Panel 控件,修改 Visible 属性:False;先隐藏 Panel,通过点击按钮控制显示和隐藏。
添加标题:
-
点击右上角的箭头,点击编辑列
-
此时 ListView 中还是一片空白,不能显示这些标题,在视图这里选择 Details
-
显示网格;此时,表格只是一片空白,可以在属性面板中设置,显示网格,如下图
-
点击右上角的箭头,点击编辑项
-
或者代码添加数据到表格中(项)
private void Button_Test_Click(object sender, EventArgs e) { //数据更新,UI暂时挂起,直到EndUpdate绘制控件,可以有效避免闪烁并大大提高加载速度 listView1.BeginUpdate(); //添加5行数据 for (int i = 0; i < 5; i++) { ListViewItem lvitem = new ListViewItem(); lvitem.SubItems[0].Text = i.ToString(); lvitem.SubItems.Add("姓名"+i.ToString()); lvitem.SubItems.Add("年龄" + i.ToString()); lvitem.SubItems.Add("地址" + i.ToString()); lvitem.SubItems.Add("生日-" + i.ToString()); listView1.Items.Add(lvitem); } //结束数据处理,UI界面一次性绘制。 listView1.EndUpdate(); }
代码实现选择内容赋值到 TextBox 上:
// 关闭窗口
private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
// 请从分类列表中选择
private void BtnSelectKind_Click(object sender, EventArgs e)
{
if (this.panelSelectKind.Visible)
{
this.panelSelectKind.Hide();
}
else
{
this.panelSelectKind.Show();
}
}
// ListView 选择的索引发生改变
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
// 在此处设断点,发现点击不同的Item后,此事件居然执行了2次
// 第一次是取消当前Item选中状态,导致整个ListView的SelectedIndices变为0
// 第二次才将新选中的Item设置为选中状态,SelectedIndices变为1
// 如果不加listview.SelectedIndices.Count>0判断,将导致获取listview.Items[]索引超界的异常
if (this.listView1.SelectedIndices != null && this.listView1.SelectedIndices.Count > 0)
{
// 获取第一列的内容
this.tbKind.Text = this.listView1.Items[this.listView1.SelectedIndices[0]].Text;
// 获取第一列子项的内容
// this.tbKind.Text = this.listView1.Items[this.listView1.SelectedIndices[0]].SubItems[2].Text;
this.panelSelectKind.Hide();
}
}
// ListView 点击了列
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
// 点击列标题是可以获取列号
Console.WriteLine(e.Column);
}
comboBox 具体实现
- MaxDropDownltems:在下拉列表中显示的最多项数(超出的将滚动显示)。默认设置无效,还是拉长了 comboxBox 的高度,全部显示了。是因为 IntegralHeight 属性(指示组合框是否应调整大小以避免显示部分项)的默认值是 true,改为 False 即可。
- 通过 Items 属性来给 comboBox 设置下拉内容
嵌入子窗体的实现
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
}
private void brnClose_Click(object sender, EventArgs e)
{
this.Close();
}
#region 关闭已有窗体,嵌入新的窗体
// 关闭已有窗体
private void CloseForm()
{
// 首先判断当前容器中是否已经存在窗体
foreach (Control item in this.splitContainer1.Panel2.Controls)
{
if (item is Form)
{
Form form = (Form)item;
form.Close();
}
}
}
// 添加新的窗体
private void addNewForm(Form form)
{
// 将子窗体设置成非顶级窗体
form.TopLevel = false;
// 让子窗体最大化显示
form.WindowState = FormWindowState.Maximized;
// 或者设置填充模式(跟上面功能一样)
// form.Dock = DockStyle.Fill
// 设置窗体的边框为:None(去掉窗体的边框)
form.FormBorderStyle = FormBorderStyle.None;
// 设置窗体的父容器(指定子窗体显示的容器)
form.Parent = this.splitContainer1.Panel2;
form.Show(); // add.Close();
}
#endregion
// 打开新增商品子窗体
private void btnAddproduct_Click(object sender, EventArgs e)
{
CloseForm();
addNewForm(new FrmAddProduct());
}
// 打开商品信息子窗体
private void button2_Click(object sender, EventArgs e)
{
CloseForm();
addNewForm(new FrmProductInfo());
}
}
在子窗体中打开其他子窗体
比如:需要在商品信息子窗体中打开新增商品子窗体,那么就需要用到使用委托和事件
在 FrmProductInfo.cs 写代码:
// 定义一个委托
public delegate void addNewProduce(object sender, EventArgs e);
public partial class FrmProductInfo : Form
{
// 定义一个委托事件
public event addNewProduce anp;
public FrmProductInfo()
{
InitializeComponent();
}
private void btnAddPro_Click(object sender, EventArgs e)
{
anp(sender, e);
}
}
修改 FrmMain.cs 中的代码:
// 打开商品信息子窗体
private void button2_Click(object sender, EventArgs e)
{
CloseForm();
FrmProductInfo frmPI = new FrmProductInfo();
frmPI.anp += this.btnAddproduct_Click;
addNewForm(frmPI);
}
工程示例
BeautyWinForm
作业
实现 商品信息 窗口的布局