第三方控件DevExpress学习笔记

本文详细介绍了DevExpress控件的使用,包括MDI窗体的创建与管理、OutLook导航条的设置、Ribbon编辑器的应用、表格控件的只读设置、皮肤的切换方法等。还涉及到数据Grid的多选、字段绑定、单元格居中以及时间控件DateEdit和TimeEdit的用法。此外,还分享了如何调整图表中柱状图的距离和宽度、坐标轴文字方向等高级技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DevExpress控件学习

 

 

1.      MDI窗体

Ø 首先需要把父窗体设置为MDI容器:

Ø 在主窗体放一个xtraTabbedMdiManager,如:

Ø 设置MDI窗体样式;

MDI子窗体标签栏的位置

子窗体关闭按钮的样式

多个标签的时候,如何显示标签导航栏

Ø 新建一子窗体,可以是DevExpress的也可以是VS自带的(VS自带的最好改下背景色为如下配置,否则会主子窗体颜色不搭配。 )

Ø 调用子窗体的代码如下:

///<summary>

///打开子窗体

///</summary>

///<paramname="frm"></param>

privatevoidOpenChildForm(Formfrm)

{

intiCount = 0;

foreach (varmdiChildinthis.MdiChildren)

    {

if (mdiChild.Text == frm.Text)

        {

mdiChild.Activate();

iCount++;

        }

    }

if (iCount> 0)

return;

frm.MdiParent = this;

frm.Show();

}

 

privatevoidbtnMqClient_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)

{

    Text = e.Link.Item.Caption;

if (e.Link.Item.Tag != null)

    {

objectooo = e.Link.Item.Tag;

    }

FrmOutLookfrm = newFrmOutLook();

OpenChildForm(frm);

}

Ø 如果不想关闭子画面,则在子画面窗体上选择属性ControlBox关闭:

 

 

2.      OutLook导航条用法:  

 

 

选中navBarGroup1,在属性栏中选择GroupStyle,可以调整图标显示样式。

 

3.      Ribbon编辑器

Ø 去掉Win7透明窗体,保持所有情况下显示风格都一致。

在Ribbon主窗体中选择属性AllowFormGlass,会在Win7风格时增加一个透明框框,很丑,所以我选择了 False

Group文字过长时,不会自动省略

关联Ribbon后,可以使用Designer进行编辑

 

也可以用代码来改变图标


TabPage使用

Ø 首先拖动XtraTabControl到界面中:

Ø 关闭TabPage的方法,我试验了很久的:

privatevoidxtraTabControl1_CloseButtonClick(object sender,EventArgs e)

{

DevExpress.XtraTab.XtraTabPage page =(DevExpress.XtraTab.XtraTabPage)((DevExpress.XtraTab.ViewInfo.ClosePageButtonEventArgs)(e)).Page;

xtraTabControl1.TabPages.Remove(page);

}

Ø 窗体标题文字被省略:

解决方案:

在属性框中的Text中填写英文,空格,横线等信息

如:客户端程序框架[DEMO] - Adaapter适配器

效果:

4.      Ribbon工具条上的Button控件,如果想使用开关效果,可以选择属性中用

5.      Ribbon工具条上的各控件(BarEditItem),与其子控件()之间的关系,及使用方式

Ø CheckEdit:如果要设置其默认值,应该用其外部容器来设置,如:chkModeSwitchContainer.EditValue = false;//不是设置这个chkModeSwitch,如图:

Ø TextEdit:如果要设置其默认值,应该用其外部容器来设置,如:txtSendMockNumContainer.EditValue = 2;

Ø 但是用外部容器来的事件(EditValueChanged)来处理内部控件值事件时,会有延迟出现,比如,想检测CheckEdit的CheckedChange事件,这时候,应该用内部控件的事件实现才能及时响应,如:

chkModeSwitch.CheckStateChanged +=ChkModeSwitchCheckStateChanged;

///<summary>

///调试模式开关

///</summary>

///<paramname="sender"></param>

///<paramname="e"></param>

voidChkModeSwitchCheckStateChanged(objectsender, EventArgs e)

{

if (((DevExpress.XtraEditors.CheckEdit)(sender)).Checked)

    {

        _debugMode = true;

    }

else

    {

        _debugMode = false;

    }

}

 

 

Ø 其他

 

6.      Ribbon窗体,可以隐藏Windows自己的标题栏,如图效果:

需要让窗体继承自RibbonForm基类

子窗体继承自XtraForm,这样可以统一界面样式、颜色等

7.      Ribbon窗体去掉快速工具栏按钮:

 

8.      NavBarControl的一些操作

 

隐藏组标签

 

关闭折叠按钮

 


 

关闭UI元素

 

允许选中

 

9.      表格控件

设置只读:

publicvoidSetGridEditEnable(booloptionSet)

{

string option = "Editable";

DevExpress.Utils.SetOptions.SetOptionValueByString(option,gridView2.OptionsBehavior, optionSet);

}

 

设置表头:

privatevoidSetData()

{

DataTabledt = newDataTable("data");

dt.Columns.Add("ID");

dt.Columns.Add("Type");

dt.Columns.Add("Content");

dt.Columns.Add("Comment");

dt.Rows.Add(newobject[] { "001","错误", "数据库连接已断开!", "建议尽快解决." });

dt.Rows.Add(newobject[] { "002","警告", "SQL 语句错误!", "检查拼写." });

dt.Rows.Add(newobject[] { "003","警告", "登陆失败!", "重新输入用户名密码." });

dt.AcceptChanges();

BindingSourcebs = newBindingSource();

bs.DataSource =dt;

    gridControl2.DataSource = bs;

 

//gridControl1

    gridView2.Columns[0].Caption = "编号";

    gridView2.Columns[1].Caption = "类型";

    gridView2.Columns[2].Caption = "错误信息";

    gridView2.Columns[3].Caption = "备注";

 

//若有一列不设置值,且其他列宽度不超出容器总宽度时,设置了列宽的列按照列宽展示,未设置列宽的列填充剩余宽度;

//若所有列均设置了列宽,在列宽总和与容器长度不匹配时,列宽按照设置的列宽数值的比例进行显示

gridView2.Columns[0].Width= 25;

gridView2.Columns[1].Width= 25;

//gridView2.Columns[2].Width= 50;

gridView2.Columns[3].Width= 50;

 

SetGridEditEnable(false);

}

 


 

10.  设置皮肤

首先,要获取多种皮肤的话,必须在Program.cs中的Main函数中注册

 

///<summary>

///应用程序的主入口点。

///</summary>

[STAThread]

staticvoid Main()

{

DevExpress.UserSkins.BonusSkins.Register();

DevExpress.Skins.SkinManager.EnableFormSkins();

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(newFrmMain());

}

 

privatevoidSetSkin(stringskinName)

{

DevExpress.LookAndFeel.UserLookAndFeel.Default.SetSkinStyle(skinName);

}

 

//获取所有皮肤名字

voidInitSkins()

{

foreach(DevExpress.Skins.SkinContainercntinDevExpress.Skins.SkinManager.Default.Skins)

    {

repositoryItemComboBox3.Items.Add(cnt.SkinName);

    }

   repositoryItemComboBox3.SelectedIndexChanged += newEventHandler(RepositoryItemComboBox2SelectedIndexChanged);

}

//ComboBox下拉事件

voidrepositoryItemComboBox1_SelectedIndexChanged(objectsender, EventArgs e)

{

DevExpress.XtraEditors.ComboBoxEditcomboBoxEdit= (DevExpress.XtraEditors.ComboBoxEdit)sender;

SetSkin(comboBoxEdit.SelectedItem.ToString());

}

 

 

11.  ComboBox下来列表(repositoryItemComboBox)


 

12.  Wizard 向导控件

Ø 有两个构造函数,只能在其中一个构造函数中初始化向导中的数据。

Ø 此向导最大的作用是导航,及动画,向导中每个页面上的控件都是自己手工添加的,在同一个页面中,可以直接操作控件,给控件赋值、取值。

Ø 向导提供一些API,可以控制向导上的元素,如:上一页,下一页等控件的使能。

Ø 可以修改向导每一页上的信息;

Ø 可以增加、删除向导页;

Ø 使用示例

                        i.             增加控件

                      ii.             其他

13.  DataGrid表格

Ø 设置列展现形式。

Ø 多选

Ø 字段绑定

Ø 通过代码设置只读

string option = "Editable";

DevExpress.Utils.SetOptions.SetOptionValueByString(option,gridView1.OptionsBehavior, false);

Ø 表头、单元格居中设置

全局调整:

 

单列调整:

如果是动态生成列,则可以如此设置:

列自动宽度开关,设置好后,拖动列宽


 

Ø 去掉分组头。

 

 

 

Ø 去掉网格线。

 

 

 

 

Ø 隐藏表行头。

 

 

 

14.  时间控件(DevExpress.XtraEditors.DateEdit、DevExpress.XtraEditors.TimeEdit)用法

Ø 这两个控件最重要的属性是有两个掩码(Mask)

Ø 区别:DevExpress.XtraEditors.DateEdit有一个向导,用起来比较方便、DevExpress.XtraEditors.TimeEdit上下图标选择时间

15.  图表

Ø 两柱状图之间距离调节

                        i.             如图:有两根柱状图

通过BarDistance调节两个柱状图之间的距离,调节为0时:

调节为2时,我们看到蓝色无条纹的柱状图整体往后平移了2个单位:

Ø 柱状图宽度调节

Ø 坐标文字方向

选中坐标轴,然后找到 Label 属性,修改角度即可:

Ø 其他

16.  其他

 

 

DevExpress控件学习

 

 

1.      MDI窗体

Ø 首先需要把父窗体设置为MDI容器:

Ø 在主窗体放一个xtraTabbedMdiManager,如:

Ø 设置MDI窗体样式;

MDI子窗体标签栏的位置

子窗体关闭按钮的样式

多个标签的时候,如何显示标签导航栏

Ø 新建一子窗体,可以是DevExpress的也可以是VS自带的(VS自带的最好改下背景色为如下配置,否则会主子窗体颜色不搭配。 )

Ø 调用子窗体的代码如下:

///<summary>

///打开子窗体

///</summary>

///<paramname="frm"></param>

privatevoidOpenChildForm(Formfrm)

{

intiCount = 0;

foreach (varmdiChildinthis.MdiChildren)

    {

if (mdiChild.Text == frm.Text)

        {

mdiChild.Activate();

iCount++;

        }

    }

if (iCount> 0)

return;

frm.MdiParent = this;

frm.Show();

}

 

privatevoidbtnMqClient_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)

{

    Text = e.Link.Item.Caption;

if (e.Link.Item.Tag != null)

    {

objectooo = e.Link.Item.Tag;

    }

FrmOutLookfrm = newFrmOutLook();

OpenChildForm(frm);

}

Ø 如果不想关闭子画面,则在子画面窗体上选择属性ControlBox关闭:

 

 

2.      OutLook导航条用法:  

 

 

选中navBarGroup1,在属性栏中选择GroupStyle,可以调整图标显示样式。

 

3.      Ribbon编辑器

Ø 去掉Win7透明窗体,保持所有情况下显示风格都一致。

在Ribbon主窗体中选择属性AllowFormGlass,会在Win7风格时增加一个透明框框,很丑,所以我选择了 False

Group文字过长时,不会自动省略

关联Ribbon后,可以使用Designer进行编辑

 

也可以用代码来改变图标


TabPage使用

Ø 首先拖动XtraTabControl到界面中:

Ø 关闭TabPage的方法,我试验了很久的:

privatevoidxtraTabControl1_CloseButtonClick(object sender,EventArgs e)

{

DevExpress.XtraTab.XtraTabPage page =(DevExpress.XtraTab.XtraTabPage)((DevExpress.XtraTab.ViewInfo.ClosePageButtonEventArgs)(e)).Page;

xtraTabControl1.TabPages.Remove(page);

}

Ø 窗体标题文字被省略:

解决方案:

在属性框中的Text中填写英文,空格,横线等信息

如:客户端程序框架[DEMO] - Adaapter适配器

效果:

4.      Ribbon工具条上的Button控件,如果想使用开关效果,可以选择属性中用

5.      Ribbon工具条上的各控件(BarEditItem),与其子控件()之间的关系,及使用方式

Ø CheckEdit:如果要设置其默认值,应该用其外部容器来设置,如:chkModeSwitchContainer.EditValue = false;//不是设置这个chkModeSwitch,如图:

Ø TextEdit:如果要设置其默认值,应该用其外部容器来设置,如:txtSendMockNumContainer.EditValue = 2;

Ø 但是用外部容器来的事件(EditValueChanged)来处理内部控件值事件时,会有延迟出现,比如,想检测CheckEdit的CheckedChange事件,这时候,应该用内部控件的事件实现才能及时响应,如:

chkModeSwitch.CheckStateChanged +=ChkModeSwitchCheckStateChanged;

///<summary>

///调试模式开关

///</summary>

///<paramname="sender"></param>

///<paramname="e"></param>

voidChkModeSwitchCheckStateChanged(objectsender, EventArgs e)

{

if (((DevExpress.XtraEditors.CheckEdit)(sender)).Checked)

    {

        _debugMode = true;

    }

else

    {

        _debugMode = false;

    }

}

 

 

Ø 其他

 

6.      Ribbon窗体,可以隐藏Windows自己的标题栏,如图效果:

需要让窗体继承自RibbonForm基类

子窗体继承自XtraForm,这样可以统一界面样式、颜色等

7.      Ribbon窗体去掉快速工具栏按钮:

 

8.      NavBarControl的一些操作

 

隐藏组标签

 

关闭折叠按钮

 


 

关闭UI元素

 

允许选中

 

9.      表格控件

设置只读:

publicvoidSetGridEditEnable(booloptionSet)

{

string option = "Editable";

DevExpress.Utils.SetOptions.SetOptionValueByString(option,gridView2.OptionsBehavior, optionSet);

}

 

设置表头:

privatevoidSetData()

{

DataTabledt = newDataTable("data");

dt.Columns.Add("ID");

dt.Columns.Add("Type");

dt.Columns.Add("Content");

dt.Columns.Add("Comment");

dt.Rows.Add(newobject[] { "001","错误", "数据库连接已断开!", "建议尽快解决." });

dt.Rows.Add(newobject[] { "002","警告", "SQL 语句错误!", "检查拼写." });

dt.Rows.Add(newobject[] { "003","警告", "登陆失败!", "重新输入用户名密码." });

dt.AcceptChanges();

BindingSourcebs = newBindingSource();

bs.DataSource =dt;

    gridControl2.DataSource = bs;

 

//gridControl1

    gridView2.Columns[0].Caption = "编号";

    gridView2.Columns[1].Caption = "类型";

    gridView2.Columns[2].Caption = "错误信息";

    gridView2.Columns[3].Caption = "备注";

 

//若有一列不设置值,且其他列宽度不超出容器总宽度时,设置了列宽的列按照列宽展示,未设置列宽的列填充剩余宽度;

//若所有列均设置了列宽,在列宽总和与容器长度不匹配时,列宽按照设置的列宽数值的比例进行显示

gridView2.Columns[0].Width= 25;

gridView2.Columns[1].Width= 25;

//gridView2.Columns[2].Width= 50;

gridView2.Columns[3].Width= 50;

 

SetGridEditEnable(false);

}

 


 

10.  设置皮肤

首先,要获取多种皮肤的话,必须在Program.cs中的Main函数中注册

 

///<summary>

///应用程序的主入口点。

///</summary>

[STAThread]

staticvoid Main()

{

DevExpress.UserSkins.BonusSkins.Register();

DevExpress.Skins.SkinManager.EnableFormSkins();

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(newFrmMain());

}

 

privatevoidSetSkin(stringskinName)

{

DevExpress.LookAndFeel.UserLookAndFeel.Default.SetSkinStyle(skinName);

}

 

//获取所有皮肤名字

voidInitSkins()

{

foreach(DevExpress.Skins.SkinContainercntinDevExpress.Skins.SkinManager.Default.Skins)

    {

repositoryItemComboBox3.Items.Add(cnt.SkinName);

    }

   repositoryItemComboBox3.SelectedIndexChanged += newEventHandler(RepositoryItemComboBox2SelectedIndexChanged);

}

//ComboBox下拉事件

voidrepositoryItemComboBox1_SelectedIndexChanged(objectsender, EventArgs e)

{

DevExpress.XtraEditors.ComboBoxEditcomboBoxEdit= (DevExpress.XtraEditors.ComboBoxEdit)sender;

SetSkin(comboBoxEdit.SelectedItem.ToString());

}

 

 

11.  ComboBox下来列表(repositoryItemComboBox)


 

12.  Wizard 向导控件

Ø 有两个构造函数,只能在其中一个构造函数中初始化向导中的数据。

Ø 此向导最大的作用是导航,及动画,向导中每个页面上的控件都是自己手工添加的,在同一个页面中,可以直接操作控件,给控件赋值、取值。

Ø 向导提供一些API,可以控制向导上的元素,如:上一页,下一页等控件的使能。

Ø 可以修改向导每一页上的信息;

Ø 可以增加、删除向导页;

Ø 使用示例

                        i.             增加控件

                      ii.             其他

13.  DataGrid表格

Ø 设置列展现形式。

Ø 多选

Ø 字段绑定

Ø 通过代码设置只读

string option = "Editable";

DevExpress.Utils.SetOptions.SetOptionValueByString(option,gridView1.OptionsBehavior, false);

Ø 表头、单元格居中设置

全局调整:

 

单列调整:

如果是动态生成列,则可以如此设置:

列自动宽度开关,设置好后,拖动列宽


 

Ø 去掉分组头。

 

 

 

Ø 去掉网格线。

 

 

 

 

Ø 隐藏表行头。

 

 

 

14.  时间控件(DevExpress.XtraEditors.DateEdit、DevExpress.XtraEditors.TimeEdit)用法

Ø 这两个控件最重要的属性是有两个掩码(Mask)

Ø 区别:DevExpress.XtraEditors.DateEdit有一个向导,用起来比较方便、DevExpress.XtraEditors.TimeEdit上下图标选择时间

15.  图表

Ø 两柱状图之间距离调节

                        i.             如图:有两根柱状图

通过BarDistance调节两个柱状图之间的距离,调节为0时:

调节为2时,我们看到蓝色无条纹的柱状图整体往后平移了2个单位:

Ø 柱状图宽度调节

Ø 坐标文字方向

选中坐标轴,然后找到 Label 属性,修改角度即可:

Ø 其他

16.  其他

 

 


<think>我们之前已经设计了一个笔记管理系统的窗体,现在需要创建窗体控件。由于之前代码中已经包含了一些控件,但为了完整性,我们将重新设计整个窗体的控件布局,并给出InitializeComponent方法的代码(通常由设计器生成,但这里我们手动编写)。窗体设计:1.菜单栏:包含文件、编辑、视图、帮助等菜单项,具体有上传文件、修改密码、退出登录、注销账号等。2.左侧面板:树形视图(TreeView)用于显示笔记分类和笔记。3.右侧面板:分割成上下两部分,上部分显示笔记内容(WebBrowser控件),下部分显示版本列表(ListView)。4.状态栏:显示当前笔记信息和状态。由于代码量较大,我们将重点放在控件的初始化和布局上,并给出一个基本的窗体布局代码。注意:在实际项目中,窗体和控件的初始化代码通常由Visual Studio设计器自动生成。但这里我们手动编写以展示完整的控件创建过程。我们将创建一个SplitContainer,左侧放置TreeView,右侧放置另一个SplitContainer(上下分割),上部分放WebBrowser,下部分放ListView。以下是Form2的完整InitializeComponent方法代码(包括控件的创建和初始化):</think>下面我将提供完整的窗体控件创建代码,包括菜单栏、树形视图、列表视图、WebBrowser 控件等组件的初始化代码。这些代码应该放在 `InitializeComponent()` 方法中,这是 Windows Forms 应用程序的核心布局代码。 ```csharp private void InitializeComponent() { // 主容器和布局 this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.treeViewNotes = new System.Windows.Forms.TreeView(); this.listViewNotes = new System.Windows.Forms.ListView(); this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.panel1 = new System.Windows.Forms.Panel(); this.lblLastModified = new System.Windows.Forms.Label(); this.lblNoteTitle = new System.Windows.Forms.Label(); this.splitContainer2 = new System.Windows.Forms.SplitContainer(); this.listViewVersions = new System.Windows.Forms.ListView(); this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.menuStrip1 = new System.Windows.Forms.MenuStrip(); this.文件ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.上传文件ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.打开ToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.退出登录ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.注销账号ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.编辑ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.修改ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.修改密码ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.删除ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.笔记ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.上传文件ToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.修改ToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.删除ToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.分类ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.版本历史ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.imageList1 = new System.Windows.Forms.ImageList(); // 设置控件属性 this.SuspendLayout(); // // splitContainer1 // this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; this.splitContainer1.Location = new System.Drawing.Point(0, 24); this.splitContainer1.Name = "splitContainer1"; // // splitContainer1.Panel1 (左侧面板) // this.splitContainer1.Panel1.Controls.Add(this.treeViewNotes); this.splitContainer1.Panel1.Controls.Add(this.listViewNotes); // // splitContainer1.Panel2 (右侧面板) // this.splitContainer1.Panel2.Controls.Add(this.panel1); this.splitContainer1.Size = new System.Drawing.Size(1000, 576); this.splitContainer1.SplitterDistance = 300; this.splitContainer1.TabIndex = 0; // // treeViewNotes (笔记分类树) // this.treeViewNotes.Dock = System.Windows.Forms.DockStyle.Top; this.treeViewNotes.Location = new System.Drawing.Point(0, 0); this.treeViewNotes.Name = "treeViewNotes"; this.treeViewNotes.Size = new System.Drawing.Size(300, 300); this.treeViewNotes.TabIndex = 0; this.treeViewNotes.ImageList = imageList1; this.treeViewNotes.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewNotes_AfterSelect); this.treeViewNotes.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeViewNotes_NodeMouseDoubleClick); // 设置图像列表 imageList1.Images.Add(SystemIcons.Folder); // 文件夹图标用于分类 imageList1.Images.Add(SystemIcons.Document); // 文档图标用于笔记 // // listViewNotes (笔记列表) // this.listViewNotes.Dock = System.Windows.Forms.DockStyle.Fill; this.listViewNotes.View = System.Windows.Forms.View.Details; this.listViewNotes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader1, // 标题 this.columnHeader2, // 分类 this.columnHeader3, // 创建时间 this.columnHeader4 // 最后修改 }); this.listViewNotes.Location = new System.Drawing.Point(0, 300); this.listViewNotes.Name = "listViewNotes"; this.listViewNotes.Size = new System.Drawing.Size(300, 276); this.listViewNotes.TabIndex = 1; this.listViewNotes.UseCompatibleStateImageBehavior = false; this.listViewNotes.FullRowSelect = true; this.listViewNotes.MultiSelect = false; this.listViewNotes.SelectedIndexChanged += new System.EventHandler(this.listViewNotes_SelectedIndexChanged); // 设置列宽 this.columnHeader1.Text = "标题"; this.columnHeader1.Width = 120; this.columnHeader2.Text = "分类"; this.columnHeader2.Width = 80; this.columnHeader3.Text = "创建时间"; this.columnHeader3.Width = 120; this.columnHeader4.Text = "最后修改"; this.columnHeader4.Width = 120; // // panel1 (主内容面板) // this.panel1.Controls.Add(this.splitContainer2); this.panel1.Controls.Add(this.lblLastModified); this.panel1.Controls.Add(this.lblNoteTitle); this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; this.panel1.Location = new System.Drawing.Point(0, 0); this.panel1.Name = "panel1"; this.panel1.Size = new System.Drawing.Size(696, 576); this.panel1.TabIndex = 0; // // lblNoteTitle (笔记标题标签) // this.lblNoteTitle.AutoSize = true; this.lblNoteTitle.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.lblNoteTitle.Location = new System.Drawing.Point(10, 10); this.lblNoteTitle.Name = "lblNoteTitle"; this.lblNoteTitle.Size = new System.Drawing.Size(100, 21); this.lblNoteTitle.TabIndex = 1; this.lblNoteTitle.Text = "未选择笔记"; // // lblLastModified (最后修改标签) // this.lblLastModified.AutoSize = true; this.lblLastModified.Location = new System.Drawing.Point(10, 40); this.lblLastModified.Name = "lblLastModified"; this.lblLastModified.Size = new System.Drawing.Size(0, 12); this.lblLastModified.TabIndex = 2; // // splitContainer2 (右侧分割容器) // this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; this.splitContainer2.Location = new System.Drawing.Point(0, 60); this.splitContainer2.Name = "splitContainer2"; this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal; // // splitContainer2.Panel1 (上部分 - 笔记内容) // this.splitContainer2.Panel1.Controls.Add(this.webBrowser1); // // splitContainer2.Panel2 (下部分 - 版本历史) // this.splitContainer2.Panel2.Controls.Add(this.listViewVersions); this.splitContainer2.Size = new System.Drawing.Size(696, 516); this.splitContainer2.SplitterDistance = 350; this.splitContainer2.TabIndex = 3; // // webBrowser1 (笔记内容浏览器) // this.webBrowser1.Dock = System.Windows.Forms.DockStyle.Fill; this.webBrowser1.Location = new System.Drawing.Point(0, 0); this.webBrowser1.MinimumSize = new System.Drawing.Size(20, 20); this.webBrowser1.Name = "webBrowser1"; this.webBrowser1.Size = new System.Drawing.Size(696, 350); this.webBrowser1.TabIndex = 0; // // listViewVersions (版本历史列表) // this.listViewVersions.Dock = System.Windows.Forms.DockStyle.Fill; this.listViewVersions.View = System.Windows.Forms.View.Details; this.listViewVersions.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader5, // 版本 this.columnHeader6, // 创建时间 this.columnHeader7 // 描述 }); this.listViewVersions.Location = new System.Drawing.Point(0, 0); this.listViewVersions.Name = "listViewVersions"; this.listViewVersions.Size = new System.Drawing.Size(696, 162); this.listViewVersions.TabIndex = 0; this.listViewVersions.UseCompatibleStateImageBehavior = false; this.listViewVersions.FullRowSelect = true; this.listViewVersions.MultiSelect = false; this.listViewVersions.DoubleClick += new System.EventHandler(this.listViewVersions_DoubleClick); // 设置列宽 this.columnHeader5.Text = "版本"; this.columnHeader5.Width = 80; this.columnHeader6.Text = "创建时间"; this.columnHeader6.Width = 120; this.columnHeader7.Text = "描述"; this.columnHeader7.Width = 400; // // menuStrip1 (主菜单) // this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.文件ToolStripMenuItem, this.编辑ToolStripMenuItem, this.笔记ToolStripMenuItem }); this.menuStrip1.Location = new System.Drawing.Point(0, 0); this.menuStrip1.Name = "menuStrip1"; this.menuStrip1.Size = new System.Drawing.Size(1000, 25); this.menuStrip1.TabIndex = 1; this.menuStrip1.Text = "menuStrip1"; // // 文件ToolStripMenuItem (文件菜单) // this.文件ToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.上传文件ToolStripMenuItem, this.打开ToolStripMenuItem1, this.退出登录ToolStripMenuItem, this.注销账号ToolStripMenuItem }); this.文件ToolStripMenuItem.Name = "文件ToolStripMenuItem"; this.文件ToolStripMenuItem.Size = new System.Drawing.Size(44, 21); this.文件ToolStripMenuItem.Text = "文件"; // // 上传文件ToolStripMenuItem (上传文件菜单项) // this.上传文件ToolStripMenuItem.Name = "上传文件ToolStripMenuItem"; this.上传文件ToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.上传文件ToolStripMenuItem.Text = "上传文件"; this.上传文件ToolStripMenuItem.Click += new System.EventHandler(this.上传文件ToolStripMenuItem_Click); // // 打开ToolStripMenuItem1 (打开文件菜单项) // this.打开ToolStripMenuItem1.Name = "打开ToolStripMenuItem1"; this.打开ToolStripMenuItem1.Size = new System.Drawing.Size(152, 22); this.打开ToolStripMenuItem1.Text = "打开"; this.打开ToolStripMenuItem1.Click += new System.EventHandler(this.打开ToolStripMenuItem1_Click); // // 退出登录ToolStripMenuItem (退出登录菜单项) // this.退出登录ToolStripMenuItem.Name = "退出登录ToolStripMenuItem"; this.退出登录ToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.退出登录ToolStripMenuItem.Text = "退出登录"; this.退出登录ToolStripMenuItem.Click += new System.EventHandler(this.退出登录ToolStripMenuItem_Click); // // 注销账号ToolStripMenuItem (注销账号菜单项) // this.注销账号ToolStripMenuItem.Name = "注销账号ToolStripMenuItem"; this.注销账号ToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.注销账号ToolStripMenuItem.Text = "注销账号"; this.注销账号ToolStripMenuItem.Click += new System.EventHandler(this.注销账号ToolStripMenuItem_Click); // // 编辑ToolStripMenuItem (编辑菜单) // this.编辑ToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.修改ToolStripMenuItem, this.修改密码ToolStripMenuItem, this.删除ToolStripMenuItem }); this.编辑ToolStripMenuItem.Name = "编辑ToolStripMenuItem"; this.编辑ToolStripMenuItem.Size = new System.Drawing.Size(44, 21); this.编辑ToolStripMenuItem.Text = "编辑"; // // 修改ToolStripMenuItem (修改菜单项) // this.修改ToolStripMenuItem.Name = "修改ToolStripMenuItem"; this.修改ToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.修改ToolStripMenuItem.Text = "修改"; // // 修改密码ToolStripMenuItem (修改密码菜单项) // this.修改密码ToolStripMenuItem.Name = "修改密码ToolStripMenuItem"; this.修改密码ToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.修改密码ToolStripMenuItem.Text = "修改密码"; this.修改密码ToolStripMenuItem.Click += new System.EventHandler(this.修改密码ToolStripMenuItem_Click); // // 删除ToolStripMenuItem (删除菜单项) // this.删除ToolStripMenuItem.Name = "删除ToolStripMenuItem"; this.删除ToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.删除ToolStripMenuItem.Text = "删除"; // // 笔记ToolStripMenuItem (笔记菜单) // this.笔记ToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.上传文件ToolStripMenuItem1, this.修改ToolStripMenuItem1, this.删除ToolStripMenuItem1, this.分类ToolStripMenuItem, this.版本历史ToolStripMenuItem }); this.笔记ToolStripMenuItem.Name = "笔记ToolStripMenuItem"; this.笔记ToolStripMenuItem.Size = new System.Drawing.Size(44, 21); this.笔记ToolStripMenuItem.Text = "笔记"; // // 上传文件ToolStripMenuItem1 (上传笔记菜单项) // this.上传文件ToolStripMenuItem1.Name = "上传文件ToolStripMenuItem1"; this.上传文件ToolStripMenuItem1.Size = new System.Drawing.Size(152, 22); this.上传文件ToolStripMenuItem1.Text = "上传笔记"; this.上传文件ToolStripMenuItem1.Click += new System.EventHandler(this.上传文件ToolStripMenuItem_Click); // // 修改ToolStripMenuItem1 (修改笔记菜单项) // this.修改ToolStripMenuItem1.Name = "修改ToolStripMenuItem1"; this.修改ToolStripMenuItem1.Size = new System.Drawing.Size(152, 22); this.修改ToolStripMenuItem1.Text = "修改"; this.修改ToolStripMenuItem1.Click += new System.EventHandler(this.修改ToolStripMenuItem_Click); // // 删除ToolStripMenuItem1 (删除笔记菜单项) // this.删除ToolStripMenuItem1.Name = "删除ToolStripMenuItem1"; this.删除ToolStripMenuItem1.Size = new System.Drawing.Size(152, 22); this.删除ToolStripMenuItem1.Text = "删除"; this.删除ToolStripMenuItem1.Click += new System.EventHandler(this.删除ToolStripMenuItem1_Click); // // 分类ToolStripMenuItem (分类菜单项) // this.分类ToolStripMenuItem.Name = "分类ToolStripMenuItem"; this.分类ToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.分类ToolStripMenuItem.Text = "分类"; this.分类ToolStripMenuItem.Click += new System.EventHandler(this.分类ToolStripMenuItem_Click); // // 版本历史ToolStripMenuItem (版本历史菜单项) // this.版本历史ToolStripMenuItem.Name = "版本历史ToolStripMenuItem"; this.版本历史ToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.版本历史ToolStripMenuItem.Text = "版本历史"; this.版本历史ToolStripMenuItem.Click += new System.EventHandler(this.版本历史ToolStripMenuItem_Click); // 窗体设置 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(1000, 600); this.Controls.Add(this.splitContainer1); this.Controls.Add(this.menuStrip1); this.MainMenuStrip = this.menuStrip1; this.Name = "Form2"; this.Text = "学习管理助手"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form2_FormClosing); this.Load += new System.EventHandler(this.Form2_Load); this.splitContainer1.Panel1.ResumeLayout(false); this.splitContainer1.Panel2.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); this.splitContainer1.ResumeLayout(false); this.panel1.ResumeLayout(false); this.panel1.PerformLayout(); this.splitContainer2.Panel1.ResumeLayout(false); this.splitContainer2.Panel2.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit(); this.splitContainer2.ResumeLayout(false); this.menuStrip1.ResumeLayout(false); this.menuStrip1.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); } ``` ### 窗体布局说明 1. **整体布局**: - 使用 `SplitContainer` 将窗体分为左右两部分 - 左侧:笔记分类树(TreeView)和笔记列表(ListView) - 右侧:笔记内容显示区域(WebBrowser)和版本历史(ListView) 2. **左侧面板**: ```csharp // TreeView 用于显示分类和笔记 this.treeViewNotes = new System.Windows.Forms.TreeView(); // ListView 用于显示当前分类下的所有笔记 this.listViewNotes = new System.Windows.Forms.ListView(); ``` 3. **右侧面板**: ```csharp // 使用另一个 SplitContainer 将右侧分为上下两部分 this.splitContainer2 = new System.Windows.Forms.SplitContainer(); // 上部:WebBrowser 控件显示笔记内容 this.webBrowser1 = new System.Windows.Forms.WebBrowser(); // 下部:ListView 显示版本历史 this.listViewVersions = new System.Windows.Forms.ListView(); ``` 4. **菜单系统**: ```csharp // 主菜单包含文件、编辑和笔记三个菜单项 this.menuStrip1 = new System.Windows.Forms.MenuStrip(); // 文件菜单包含上传、打开、退出登录和注销账号 this.文件ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); // 编辑菜单包含修改和修改密码 this.编辑ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); // 笔记菜单包含上传、修改、删除、分类和版本历史 this.笔记ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); ``` 5. **状态显示**: ```csharp // 显示当前笔记标题 this.lblNoteTitle = new System.Windows.Forms.Label(); // 显示最后修改时间 this.lblLastModified = new System.Windows.Forms.Label(); ``` ### 事件处理程序 以下是与上述控件相关的事件处理程序声明: ```csharp // 窗体事件 private void Form2_Load(object sender, EventArgs e); private void Form2_FormClosing(object sender, FormClosingEventArgs e); // 菜单事件 private void 上传文件ToolStripMenuItem_Click(object sender, EventArgs e); private void 打开ToolStripMenuItem1_Click(object sender, EventArgs e); private void 退出登录ToolStripMenuItem_Click(object sender, EventArgs e); private void 注销账号ToolStripMenuItem_Click(object sender, EventArgs e); private void 修改密码ToolStripMenuItem_Click(object sender, EventArgs e); private void 修改ToolStripMenuItem_Click(object sender, EventArgs e); private void 删除ToolStripMenuItem1_Click(object sender, EventArgs e); private void 分类ToolStripMenuItem_Click(object sender, EventArgs e); private void 版本历史ToolStripMenuItem_Click(object sender, EventArgs e); // 树视图事件 private void treeViewNotes_AfterSelect(object sender, TreeViewEventArgs e); private void treeViewNotes_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e); // 列表视图事件 private void listViewNotes_SelectedIndexChanged(object sender, EventArgs e); private void listViewVersions_DoubleClick(object sender, EventArgs e); ``` ### 完整窗体设计建议 为了更好的用户体验,建议添加以下功能组件: 1. **工具栏**: ```csharp private ToolStrip toolStrip1; private void InitializeToolbar() { this.toolStrip1 = new ToolStrip(); this.toolStrip1.Items.Add(new ToolStripButton("上传", null, 上传文件ToolStripMenuItem_Click)); this.toolStrip1.Items.Add(new ToolStripButton("修改", null, 修改ToolStripMenuItem_Click)); this.toolStrip1.Items.Add(new ToolStripButton("删除", null, 删除ToolStripMenuItem1_Click)); this.toolStrip1.Items.Add(new ToolStripSeparator()); this.toolStrip1.Items.Add(new ToolStripButton("分类", null, 分类ToolStripMenuItem_Click)); this.toolStrip1.Items.Add(new ToolStripButton("历史", null, 版本历史ToolStripMenuItem_Click)); this.toolStrip1.Dock = DockStyle.Top; this.Controls.Add(this.toolStrip1); } ``` 2. **状态栏**: ```csharp private StatusStrip statusStrip1; private ToolStripStatusLabel lblStatus; private void InitializeStatusBar() { this.statusStrip1 = new StatusStrip(); this.lblStatus = new ToolStripStatusLabel("就绪"); this.statusStrip1.Items.Add(this.lblStatus); this.statusStrip1.Dock = DockStyle.Bottom; this.Controls.Add(this.statusStrip1); } ``` 3. **搜索框**: ```csharp private ToolStripTextBox txtSearch; private void AddSearchBox() { txtSearch = new ToolStripTextBox(); txtSearch.KeyDown += (s, e) => { if (e.KeyCode == Keys.Enter) SearchNotes(txtSearch.Text); }; this.toolStrip1.Items.Add(new ToolStripLabel("搜索:")); this.toolStrip1.Items.Add(txtSearch); } ``` 4. **图标资源**: - 为菜单项和工具栏按钮添加图标 - 使用资源文件或项目资源加载图标 - 建议使用 16x16 像素的图标 ### 数据库连接设置 在窗体中添加数据库连接配置: ```csharp private string connectionString = "Data Source=localhost;Initial Catalog=学习管理助手;Integrated Security=True;"; // 或者从配置文件读取 private string GetConnectionString() { return ConfigurationManager.ConnectionStrings["LearningDB"].ConnectionString; } ``` ### 窗体初始化逻辑 在 `Form2_Load` 事件中初始化数据: ```csharp private void Form2_Load(object sender, EventArgs e) { try { // 初始化树视图 InitializeNoteTree(); // 加载分类和笔记 LoadCategoriesAndNotes(); // 更新最近文件菜单 UpdateRecentFilesMenu(); // 设置状态 lblStatus.Text = "就绪"; } catch (Exception ex) { MessageBox.Show($"初始化失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } ``` ### 最佳实践建议 1. **异步加载**: ```csharp private async void Form2_Load(object sender, EventArgs e) { lblStatus.Text = "正在加载..."; await Task.Run(() => LoadCategoriesAndNotes()); lblStatus.Text = "就绪"; } ``` 2. **错误处理**: ```csharp private void SafeExecute(Action action) { try { action(); } catch (SqlException ex) { MessageBox.Show($"数据库错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (IOException ex) { MessageBox.Show($"文件操作错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (Exception ex) { MessageBox.Show($"操作失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } // 使用示例 private void 上传文件ToolStripMenuItem_Click(object sender, EventArgs e) { SafeExecute(() => { // 上传文件逻辑 }); } ``` 3. **资源清理**: ```csharp protected override void Dispose(bool disposing) { if (disposing) { if (webBrowser1 != null) webBrowser1.Dispose(); if (components != null) components.Dispose(); } base.Dispose(disposing); } ``` 4. **DPI自适应**: ```csharp // 在窗体构造函数中 this.AutoScaleMode = AutoScaleMode.Dpi; this.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); ``` ### 界面美化建议 1. **使用现代UI控件**: - 考虑使用 DevExpress、Telerik 等第三方UI库 - 或者使用 .NET MAUI 实现跨平台界面 2. **主题支持**: ```csharp // 在设置中添加主题选择 private void ApplyTheme(string themeName) { if (themeName == "Dark") { this.BackColor = Color.FromArgb(30, 30, 30); this.ForeColor = Color.White; // 应用深色主题到所有控件 } else { // 应用浅色主题 } } ``` 3. **动画效果**: ```csharp // 使用动画库如 Bunifu UI private void AnimateControl(Control control) { BunifuAnimator animator = new BunifuAnimator(); animator.AnimationType = BunifuAnimator.AnimationTypes.Particle; animator.Cursor = Cursors.Hand; animator.Duration = 1000; animator.TimeStep = 0.03f; animator.Animate(control); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值