首页编程menustrip,c#winform contentmenustrip

menustrip,c#winform contentmenustrip

编程之家2023-11-01118次浏览

各位老铁们,大家好,今天由我来为大家分享menustrip,以及c#winform contentmenustrip的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

menustrip,c#winform contentmenustrip

c#winform contentmenustrip

调用方式:.net2.0中SqlDependency

背景需求:对于数据中表A数据字段的变更,需要引发相应业务逻辑,插入或更新相关表或字段。在以往的方式我们多会在数据库端下文章,建立相应触发器,来完成业务逻辑操作。不过这种方式仅适用于单纯对于数据操作的需求,可是当我们要完成更复杂的业务需求是却不太容易了(虽然sql05已经支持托管代码的使用了)。可能你会想到我们可以轮询数据库相关表或视图,来发现数据的变化,可是这对于性能和即时性却是个不容易取舍的问题。不过在SqlServer2005中有了新的方案,那就是查询通知。

查询通知是在MicrosoftSQLServer2005中以及ADO.NET2.0的System.Data.SqlClient命名空间中引入的。查询通知建立在ServiceBroker基础结构的基础上,使应用程序可以在数据更改时收到通知。如果应用程序提供数据库中信息的缓存(例如Web应用程序),需要在源数据更改时接收通知,此功能特别有用。

通过三种方式可以使用ADO.NET实现查询通知:

低级实现由SqlNotificationRequest类提供,该类公开服务器端功能,使您可以对通知请求执行命令。

高级实现由SqlDependency类提供,该类提供源应用程序与SQLServer之间通知功能的高级抽象,使您可以使用相关性来检测服务器中的更改。大多数情况下,这是托管客户端应用程序通过适用于SQLServer的.NETFramework数据提供程序利用SQLServer通知功能的最简单、最有效的方法。

menustrip,c#winform contentmenustrip

此外,使用ASP.NET2.0(或更高版本)构建的Web应用程序可以使用SqlCacheDependency帮助器类。

如果应用程序需要通过刷新显示或缓存来响应基础数据中的更改,查询通知非常有用。如果执行相同命令生成的结果集与最初检索到的结果集不同,则MicrosoftSQLServer可允许.NETFramework应用程序向SQLServer发送命令和请求通知。服务器上生成的通知通过队列发送,供以后处理。

您可以为SELECT和EXECUTE语句设置通知。使用EXECUTE语句时,SQLServer会为执行的命令而不是EXECUTE语句本身注册通知。该命令必须满足SELECT语句的要求和限制。当注册通知的命令包含多个语句时,数据库引擎会为批处理中的每个语句创建一个通知。

使用查询通知的应用程序有一组通用的要求。必须正确配置数据源才能支持SQL查询通知,并且用户必须具有正确的客户端和服务器端权限。

要使用查询通知,必须符合下列条件:

1.使用SQLServer2005或SQLServer2008。

menustrip,c#winform contentmenustrip

2.对数据库启用查询通知。

3.确保用于连接数据库的用户ID具有必要的权限。

4.使用SqlCommand对象执行有效的SELECT语句,包含关联的通知对象—SqlDependency或SqlNotificationRequest。

5.提供所监视的数据更改时用于处理通知的代码。

下面就以一个例子来说明使用SqlDependency的整个流程

using System;

using System.Collections.Generic;

using System.Text;

using System.Data.SqlClient;

using System.Data;

using System.Configuration;

using System.Windows.Forms;

namespace CaptureWeb

{

public class SQLServiceBroker

{

private string connectionStr= ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();

private string sqlStr="";

private SqlConnection connection= null;

public delegate void UIDelegate();

private UIDelegate uidel= null;

public Form form= null;

///<summary>

///

///</summary>

///<param name="TableName"></param>

///<param name="ColumnNames"></param>

public SQLServiceBroker(string TableName, List<string> ColumnNames)

{

string columns="";

foreach(string str in ColumnNames)

{

if(columns!="")

columns= columns+",";

columns= columns+"["+ str+"]";

}

this.sqlStr= string.Format("select{0} From [dbo].[{1}]", columns, TableName);

}

///<summary>

///

///</summary>

///<param name="constr"></param>

///<param name="TableName"></param>

///<param name="ColumnNames"></param>

public SQLServiceBroker(string constr, string TableName, List<string> ColumnNames)

: this(TableName, ColumnNames)

{

this.connectionStr= ConfigurationManager.ConnectionStrings[constr].ToString();

}

///<summary>

///

///</summary>

~SQLServiceBroker()

{

StopDependency();

connection.Dispose();

}

///<summary>

///

///</summary>

///<returns></returns>

public bool EnoughPermission()

{

SqlClientPermission perm= new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);

try

{

perm.Demand();

return true;

}

catch(System.Exception)

{

return false;

}

}

///<summary>

///

///</summary>

///<param name="uidelegate"></param>

public void InitDependency(UIDelegate uidelegate)

{

SqlDependency.Stop(connectionStr);

SqlDependency.Start(connectionStr);

if(connection== null)

connection= new SqlConnection(connectionStr);

if(!EnoughPermission())

throw new Exception("没有权限(SqlClientPermission)!");

if(uidelegate== null)

throw new Exception("回调方法未指定(UIDelegate)!");

if(connection== null)

throw new Exception("未初始化(InitDependency)!");

this.uidel= uidelegate;

}

///<summary>

///传入窗体对象,以防止委托有需要访问UI层控件是引发的“从不是创建控件的线程访问它”

///</summary>

///<param name="form1"></param>

///<param name="uidelegate"></param>

public void InitDependency(Form form1, UIDelegate uidelegate)

{

InitDependency(uidelegate);

this.form= form1;

}

///<summary>

///

///</summary>

public void StartDependency()

{

//这里很奇怪,每次都需要新的command对象

using(SqlCommand command= new SqlCommand(sqlStr, connection))

{

command.Notification= null;

SqlDependency dependency= new SqlDependency(command);

dependency.OnChange+= new OnChangeEventHandler(dependency_OnChange);

if(connection.State!= ConnectionState.Open)

connection.Open();

command.ExecuteNonQuery();

command.Dispose();

}

}

///<summary>

///

///</summary>

public void StopDependency()

{

SqlDependency.Stop(connectionStr);

if(connection!= null)

connection.Close();

}

///<summary>

///

///</summary>

///<param name="sender"></param>

///<param name="e"></param>

private void dependency_OnChange(object sender, SqlNotificationEventArgs e)

{

//注销监测事件

SqlDependency dependency=(SqlDependency)sender;

dependency.OnChange-= dependency_OnChange;

//放在移除事件之后又很大必要,防止ui层调用更新相同表时,进入循环出发调用

//uidel.Invoke();

//uidel();

//使用from.Invoke调用防止访问界面控件引发“从不是创建控件的线程访问它”

if(form!= null)

form.Invoke(uidel);

else

uidel();

//再次启动监听

StartDependency();

}

}

}

调用方式:

SQLServiceBroker broker;

private void button1_Click(object sender, EventArgs e)

{

//需要监测的列

List<string> columns= new List<string>();

columns.Add("test1");

columns.Add("test2");

string table="test";

broker= new SQLServiceBroker(table, columns);

//实例化毁掉函数

SQLServiceBroker.UIDelegate uidel= new SQLServiceBroker.UIDelegate(writeCon);

//初始化,及传入回调函数

broker.InitDependency(uidel);

//初始化,传入窗体对象对于需要委托中访问ui控件的情况

//broker.InitDependency(this, uidel);

//启动监听

broker.StartDependency();

MessageBox.Show("启动");

}

private void writeCon()

{

MessageBox.Show("changed");

}

代码比较简单,都有说明,这里有必要注意几点问题:

1.首先需要在SQLServer2005上执行ALTERDATABASE<DatabaseName>SETENABLE_BROKER;语句让相应的数据库启用监听服务,以便支持SqlDependency特性。

2.对于SqlCommand的cmdText有特殊要求,其中不能用*,不能用top,不能用函数,包括聚合函数,不能用子查询,包括where后的子查询,不能用外连接,自连接,不能用临时表,不能用变量,不能用视图,不能垮库,表名之前必须加类似dbo数据库所有者这样的前缀。

3.其中在使用当中发现SqlConnection对象应该是一直存在的,因此在此示例中升级为属性,如果将它生命在StartDependency方法体中,出现只能调用一次的情况,因为对于SqlDependency需要connection对象的存在。

4.在使用委托传入调用方法是,如果方法有访问界面UI控件的情况,需要传入窗体对象,以form.Invoke(uidel);的方式调用,否则会引发“从不是创建控件的线程访问它”异常。

5.对于回调函数中需要更新正在监听的表时防止循环调用造成死循环,请在调用委托之前先移除onchange事件dependency.OnChange-=dependency_OnChange;

实例..代码..已经上传..

SQLServiceBroker broker;

private void button1_Click(object sender, EventArgs e)

{

//需要监测的列

List&amp;lt;string&amp;gt; columns= new List&amp;lt;string&amp;gt;();

columns.Add("test1");

columns.Add("test2");

string table="test";

broker= new SQLServiceBroker(table, columns);

//实例化毁掉函数

SQLServiceBroker.UIDelegate uidel= new SQLServiceBroker.UIDelegate(writeCon);

//初始化,及传入回调函数

broker.InitDependency(uidel);

//初始化,传入窗体对象对于需要委托中访问ui控件的情况

//broker.InitDependency(this, uidel);

//启动监听

broker.StartDependency();

//在这里重新查询TEST然后绑定数据...

}

private void writeCon()

{

MessageBox.Show("changed");

}

其实只需要改动一点点

如果按照你评论说的那么简单

其实就是下面这3句话解决

public Form2()

{

InitializeComponent();

this.contextMenuStrip1.Opening+=new CancelEventHandler(contextMenuStrip1_Opening);

}

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)

{

//在这里查询数据库

this.contextMenuStrip1.Items.Add("菜单项目1");

this.contextMenuStrip1.Items.Add("菜单项目2");

this.contextMenuStrip1.Items.Add("菜单项目3");

this.contextMenuStrip1.Items.Add("菜单项目4");

this.contextMenuStrip1.Items.Add("菜单项目5");

}

MenuStrip控件的属性

属性描述 CanOverflow获取或设置一个值,指示MenuStrip控件是否支持溢出功能。 GripStyle获取或设置用于重新定位控件的手柄的可见性。 Items获取属于 ToolStrip控件的所有项。 MdiWindowListItem获取或设置用于显示多文档界面(MDI)子窗体列表的 ToolStripMenuItem控件。 ShowItemToolTips获取或设置一个值,指示是否显示 MenuStrip控件的工具提示。 Stretch获取或设置一个值,指示 MenuStrip控件是否在其容器中从一端拉伸到另一端

C# WinForm界面设计教程第12节——MenuStrip菜单

我是笑林新记,分享一下我使用C#的一些用法,希望对大家有帮助!

Visual Studio版本:Enterprise 2015

1、本节要点

本节课要讲的是菜单控件的使用,工具箱中有两种菜单MenuStrip和ContextMenuStrip,分别用于工具栏菜单和右键菜单。

2、MenuStrip菜单

首先是MenuStrip,这个从工具栏中拖过来默认就会紧贴最上面。

它可以有多级菜单,一级菜单像上图中的文件,编辑和编辑右边可以继续添加的的“请在此处键入”。二级菜单:编辑下面的编辑1和编辑1下面的继续新增。三级菜单:编辑1右侧的编辑1-1和它下面的继续新增。

双击菜单,可以自动添加菜单点击事件,右键属性中可以更改Name名称。我们来给菜单“编辑1-1”添加事件

这里出现了事件名称含有中文,这个是没有关系的哈,更改的话,是更改属性中的Name即可。

我们来看一下运行结果:

3、ContextMenuStrip菜单

第二种就是ContextMenuStrip,同样也是拖过来就行,这个添加方式和MenuStrip是一样的,不同的是,这个添加完成后,页面是没有显示的,假如你发现刚添加好的菜单不见了,不要着急,在下面可以找到。

下面会有,你点击那个就会显示那个。如果你想将这个菜单用于右键显示的话,你要选中当前Form,右键打开属性,找到ContextMenuStrip属性,选择你要分配的菜单就可以了。

看一下运行效果:

需要补充的是,这个右键菜单也可以放在其它控件中,比如Panel、PictureBox等,只要这个控件有ContextMenuStrip属性就可以。

文章分享结束,menustrip和c#winform contentmenustrip的答案你都知道了吗?欢迎再次光临本站哦!

域名证书下载 如何获取域名证书定制企业网站(关于企业官网:模板网站与定制网站的区别)