几个C#编程的小技巧
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了几个C#编程的小技巧相关的知识,希望对你有一定的参考价值。
一、最小化窗口点击“X”或“Alt F4”时,最小化窗口,如:
protected override void WndProc(ref Message m)
const int
WM_SYSCOMMAND = 0x0112;
const int SC_CLOSE = 0xF060;
if (m.Msg ==
WM_SYSCOMMAND && (int) m.WParam == SC_CLOSE)
// User clicked
close button
this.WindowState =
FormWindowState.Minimized;
return;
base.WndProc(ref m);
二、如何让Foreach 循环运行的更快
foreach是一个对集合中的元素进行简单的枚举及处理的现成语句,用法如下例所示:
using System;
using System.Collections;
namespace
LoopTest
class Class1
static void Main(string[] args)
//
create an ArrayList of strings
ArrayList array = new
ArrayList();
array.Add("Marty");
array.Add("Bill");
array.Add("George");
//
print the value of every item
foreach (string item in
array)
Console.WriteLine(item);
你可以将foreach语句用在每个实现了Ienumerable接口的集合里。如果想了解更多foreach的用法,你可以查看.NET Framework
SDK文档中的C# Language Specification。
在编译的时候,C#编辑器会对每一个foreach 区域进行转换。
IEnumerator enumerator = array.GetEnumerator();
try
string
item;
while (enumerator.MoveNext())
item = (string)
enumerator.Current;
Console.WriteLine(item);
finally
IDisposable d = enumerator as IDisposable;
if (d != null)
d.Dispose();
这说明在后台,foreach的管理会给你的程序带来一些增加系统开销的额外代码。
三、将图片保存到一个XML文件
WinForm的资源文件中,将PictureBox的Image属性等非文字内容都转变成文本保存,这是通过序列化(Serialization)实现的,
例子://
using System.Runtime.Serialization.Formatters.Soap;
Stream stream = new
FileStream("E://Image.xml",FileMode.Create,FileAccess.Write,FileShare.None);
SoapFormatter
f = new SoapFormatter();
Image img =
Image.FromFile("E://Image.bmp");
f.Serialize(stream,img);
stream.Close();
四、屏蔽CTRL-V
在WinForm中的TextBox控件没有办法屏蔽CTRL-V的剪贴板粘贴动作,如果需要一个输入框,但是不希望用户粘贴剪贴板的内容,可以改用RichTextBox控件,并且在KeyDown中屏蔽掉CTRL-V键,例子:
private void richTextBox1_KeyDown(object sender,
System.Windows.Forms.KeyEventArgs e)
if(e.Control &&
e.KeyCode==Keys.V)
e.Handled = true;
ps: 网上摘抄,看了以后感觉不错,以后碰见好的再陆续发布
Tags: dotnet技术 , c#开发技术
ASP.NET 2.0中使用webpart系列控件
Dot-Net技术 | 阅读(144) | 评论(0)
Oct
29
2005
[此文来源于互联网,牛C网只负责收集整理]
在现在的网站设计中,更强调的是用户的个性化设置,让用户可以自由的设置符合自己喜好的页面成为网站开发人员的头号难题,不过现在看来这个难题微软帮我们解决了。在asp.net
2.0中新增加了一系列webpart控件,可以让用户很方便地对网页的各区域布局进行调整。在一些web应用程序中,如果用户想自定义页面布局,比如一个新闻发布系统,想让左,中,右三栏的位置进行调换的话,就可以使用webpart控件。
下面,我们来看下asp.net 2.0中webpart系列控件的一些基本用法。
首先,在vs.net 2005 中的工具箱中,可以找到如下图所示的webpart系列控件,有很多个,限于篇幅,本文介绍其中的一些重要的控件:
在webpart系列控件中,其中的webpartmanager控件用于统一管理各webpart控件。而webpartzone控件,则是提供了各区域划分,在这些区域中,用户可以往里面放置各式各样的控件,而当运行的时候,用户可以移动的就是这些webpartzone控件所在的区域。
为增强认识,我们先做个简单的例子。
1、首先使用vs.net 2005 beta 2(或者RC1)新建一个web站点,
2、往窗体中拖拉一个webpartmanager控件,再建一个3列1行的表格,分别往每个单元格里拖拉一个webpartzone控件,如下图:
3、往webpartzone1中拖拉放一个日历控件,并为这个日历控件选择一个合适的样式
4、切换到代码视图状态,将日历控件的title属性改为:today’s
date。注意的是,日历控件本身没有title属性,但当一个控件加入到webpartzone区域中去后,则该控件被自动包装为GenericWebPart类型控件,这些类型的控件有title属性。
5、这时,我们可以按F5来运行该程序,运行如下图所示,可以看到,区域的右上角有最小化和关闭,恢复的按钮。
接下来,我们介绍如何在webpart系列控件中,使用用户自定义的控件。
1、首先,我们为工程项目增加一个"google.ascx"的控件,并且在images目录下,添加google那张著名的logo图片。
接着,往窗体中添加一个2*2行的表格,再往其中的一个单元格添加一个image图象控件,指定其图象为google.gif,再添加一个文本框,一个按钮,如下图所示,其中,括号内的是该控件的名称:
3、在btnsearch按钮的click事件中写入如下代码:
Response.Write(Page.IsValid)
Dim queryStr As String =
HttpUtility.UrlEncode(txtSearch.Text)
Response.Redirect("http://www.google.com/search?q=" &
queryStr)
End Sub
4、这时,将写好的google.ascx控件,整个拖拉到我们刚才建立好的表格中的中间那个单元格,如下图所示:
我们并且修改代码如下,修改其名称为google serach:
<uc1:Google title="Google Search" runat="server" ID="Google1" />
接下来,F5运行,可以看到,可以在googlesearch所在的webpart里进行google搜索了。
同时,如果觉得webpart的那些关闭,恢复,最小化的按钮不大好看,还可以自定义按钮,比如在images目录下,添加下面的图片:
然后,在webpartzone1的属性中,指定如下的属性就可以了。
CloseVerb.ImageUrl="Images/CloseVerb.gif"
EditVerb.ImageUrl="Images/EditVerb.gif"
MinimizeVerb.ImageUrl="Images/MinimizeVerb.gif"
RestoreVerb.ImageUrl="Images/RestoreVerb.gif"
使webpart动起来
上面设计的webpart还没能动起来,要让webpart动起来的话,必须要将webpar设置为design display
模式。先为webpart添加下面的radiobutton选择框
<asp:RadioButtonList ID="rblMode" runat="server"
AutoPostBack="True">
<asp:ListItem>Browse Display
Mode</asp:ListItem>
<asp:ListItem>Design Display
Mode</asp:ListItem>
</asp:RadioButtonList>
并且在code-behind的代码中,写入如下代码:
Protected Sub RadioButtonList1_SelectedIndexChanged(ByVal sender As
Object, _ ByVal e As System.EventArgs) _ Handles
rblMode.SelectedIndexChanged
Select Case rblMode.SelectedIndex
Case 0 :
WebPartManager1.DisplayMode =WebPartManager.BrowseDisplayMode
Case 1 :
WebPartManager1.DisplayMode = WebPartManager.DesignDisplayMode
End
Select
End Sub
运行上面代码,选择design display mode,则可以象下图那样,自由拖动webpart,
要注意的是,当移动各webpart的位置后,即使关掉浏览器,下次重新打开时,依然可以看到各个控件保持原来的位置。其实,asp.net
2.0是使用在aspnetdb.mdf中的一个叫aspnet_PersonalizationPerUser的表来保存数据的,表的结构如下所示:
Field
Value
Id 928e121a-4042-4fb4-9520-21210b9b37c1
PathId
7c3b5dc0-04d0-48a2-bbb2-2b70286f22fe
UserId
9bff14df-024f-4bda-9a0a-b4a19ab9e387
PageSettings <Binary data>
LastUpdatedDate 10/06/2005 4:44:05 AM
如果想恢复各控件的原来位置,只需要将该数据表中相应的行删除掉就可以了。但有个问题是,如果使用每一个webpart的关闭按钮,则很难再将其恢复(当然删除数据表中的行,但十分麻烦)。在asp.net
2.0中,提供了另一种webpart,叫做catlogzone控件,下面介绍其用法:
1、往窗体中拖拉一个catlogzone控件,如下图所视。
2、往该catlogzone控件区域中,再拖放三个webpart系列的控件,分别是DeclarativeCatalogPart,
PageCatalogPart, and
ImportCatalogPart,如下图所示。其中,DeclarativeCatalogPart控件的作用是,显示目前页面上有哪些可以用的webpart控件;PageCatalogPart的作用是,可以让用户通过勾选的方式,选定将哪些控件添加转移到其他webpart区域中去。ImportCatalogPart则可以通过外部磁盘文件的方式,加载其他做好了的webpart部件。
3、在radiobutton区域中,修改以下代码,增添一个catalog display的显示模式:
<asp:RadioButtonList ID="rblMode" runat="server"
AutoPostBack="True">
<asp:ListItem>Browse Display
Mode</asp:ListItem>
<asp:ListItem>Design Display
Mode</asp:ListItem>
<asp:ListItem>Catalog Display
Mode</asp:ListItem>
</asp:RadioButtonList>
然后,在code-behind的代码中,将代码修改为如下:
Protected Sub rblMode_SelectedIndexChanged( _
ByVal sender As Object,
_
ByVal e As System.EventArgs) _
Handles
rblMode.SelectedIndexChanged
Select Case rblMode.SelectedIndex
Case 0
: WebPartManager1.DisplayMode = WebPartManager.BrowseDisplayMode
Case 1 :
WebPartManager1.DisplayMode = WebPartManager.DesignDisplayMode
Case 2 :
WebPartManager1.DisplayMode = WebPartManager.CatalogDisplayMode
End
Select
End Sub
4、在DeclarativeCatalogPart任务菜单上,点击右上角的智能感知按钮,然后选"edit
templates"的链接,进入模版编辑状态,如下图:
再往其中的webpartstemplate区域中拖拉一个google.ascx控件,如下图,这将允许用户在运行时,可以自由地往页面增加这样的google搜索控件。
5、然后修改代码如下:
<ZoneTemplate>
<asp:DeclarativeCatalogPart
ID="DeclarativeCatalogPart1"
runat="server">
<WebPartsTemplate>
<uc1:Google title="Google Search"
ID="Google2" runat="server"
/>
</WebPartsTemplate>
</asp:DeclarativeCatalogPart>
6、运行程序,可以看到,当选择catalog display mode时,会显示如下图所示的catalog
zone,其中列出了当前可用的有哪些webpart控件,我们可以把这个google的控件加到其他的webpart区域,也可以尝试将已经存在的webpart控件关闭,然后在catalog
zone区域中的控件列表中,把它们再加回到页面中去。
此外,在运行期间,还可以动态地修改webpart控件的外观等属性,如下:
1) 往窗体中添加一个editor
zone的区域控件,往其中再拖放一个appearanceEdiotrPart控件,该控件可以在运行时,让用户动态改变各webpart控件的属性。
2) 我们再修改radiobutton选择框的代码如下,则加一个编辑模式:
<asp:RadioButtonList ID="rblMode" runat="server"
AutoPostBack="True">
<asp:ListItem>Browse Display
Mode</asp:ListItem>
<asp:ListItem>Design Display
Mode</asp:ListItem>
<asp:ListItem>Catalog Display
Mode</asp:ListItem>
<asp:ListItem>Edit Display
Mode</asp:ListItem>
</asp:RadioButtonList>
3) 修改code-behind代码如下:
Protected Sub rblMode_SelectedIndexChanged(ByVal sender As Object, ByVal
e As System.EventArgs) _
Handles rblMode.SelectedIndexChanged
Select Case
rblMode.SelectedIndex
Case 0 : WebPartManager1.DisplayMode =
WebPartManager.BrowseDisplayMode
Case 1 : WebPartManager1.DisplayMode =
WebPartManager.DesignDisplayMode
Case 2 : WebPartManager1.DisplayMode =
WebPartManager.CatalogDisplayMode
Case 3 : WebPartManager1.DisplayMode =
WebPartManager.EditDisplayMode
End Select
End Sub
4) 运行程序,选择edit display
mode模式,这时,会发现每个控件的右上角,会多了一个"edit"的按钮,点该按钮,弹出如下图的窗体,用户可以修改每个控件的外观等属性。
最后,我们看下,webpart控件之间还可以进行相互之间的通信,下面的例子中,要实现的是,在一个日历控件中点选某一个日期,会在已经做好的googlesearch的webpart控件的文本框中显示其日期,达到通信的目的,下面介绍其实现步骤:
1、为了使两个webpart控件之间进行通信,必须先声明一个公共的接口。往工程项目里增加一个叫ISelectedDate.vb的类文件,放在app_code目录下,写入如下代码:
Imports Microsoft.VisualBasic
Public Interface
ISelectedDate
ReadOnly Property SelectedDate( ) As Date
End Interface
这里,我们返回一个只读的日期属性selectedDate.
2、再创建一个日历控件CalendarUC.ascx,其中拖拉一个普通的日历控件即可。然后写入如下代码:
Partial Class CalendarUC_ascx
Inherits
System.Web.UI.UserControl
Implements ISelectedDate
Public ReadOnly Property SelectedDate( ) As Date Implements
ISelectedDate.SelectedDate
Get
Return
Calendar1.SelectedDate.Date
End Get
End Property
<ConnectionProvider("SelectedDate", "SelectedDate")> _
Public Function
GetSelectedDate( ) As ISelectedDate
Return Me
End Function
End
Class
上面的代码,首先实现了已经声明了的IselectedDate接口,要留意的是<ConnectionProvider("SelectedDate",
"SelectedDate")>中的写法。由于在这个例子中,日历控件要为其他的控件提供信息,因此,该日历控件是一个provider(提供者),而另外的接收信息的控件,是consumer(消费者)。而两者为了要通信,必须要提供一个通信接入点,就象一个电插头,要找到合适的电插板一样。因此,<ConnectionProvider("SelectedDate",
"SelectedDate")>中的第一个参数,定义了两者的接口点,第二个参数,则是要传递给consumer的参数,本例是selectedDate。
3、接下来,我们在已经做好的google.ascx控件的代码中,编写如下代码:
Private _selectedDate As ISelectedDate
<ConnectionConsumer("SelectedDate", "SelectedDate")> _
Sub
setSearchText(ByVal SearchText As ISelectedDate)
Me._selectedDate =
SearchText
End Sub
Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.PreRender
If _selectedDate IsNot Nothing
Then
txtSearch.Text = _selectedDate.SelectedDate.ToShortDateString
End
If
End Sub
可以看到 <ConnectionConsumer("SelectedDate",
"SelectedDate")>的定义必须和provider中的定义一样。
4、再修改如下代码,将两个控件的命名变得通俗易懂
<ZoneTemplate>
<uc1:Google title="Google Search" runat="server"
ID="Google1" />
<uc3:CalendarUC title="Calendar Web Part" runat="server"
ID="CalendarUC1" />
</ZoneTemplate>
5、最后,为了使两者能互相通信,必须在default.aspx页中修改如下代码:
<asp:WebPartManager ID="WebPartManager1"
runat="server">
<StaticConnections>
<asp:WebPartConnection ID="Connection"
ProviderID="CalendarUC1"
ProviderConnectionPointID="SelectedDate"
ConsumerID="Google1"
ConsumerConnectionPointID="SelectedDate"
/>
</StaticConnections>
</asp:WebPartManager>
6、在页面代码中,增加一个radiobutton,用作显示connection模式,并写入如下代码:
Case 4 : WebPartManager1.DisplayMode =
WebPartManager.ConnectDisplayMode
7、运行程序,选择connect displaymode模式。再选择GOOGLE
SEARCH的那个webpart控件,点右上角的"conenct"按钮,此时,会显示如下图所示,提示你要选择从那个控件中得到信息,这里选择日历控件,按确定。那么,当点选日历控件的某个日期值的时候,GOOGLE
SEARCH的那个文本框里,就会显示相应的日期了。 参考技术A 主要方法
参数地址传递
有点时候需要对两个参数操作,这样用返回值实现其来就复杂了。要明白引用传递,对于值类型来说:修饰符ref修饰。
参数个数方法
在写方法时,有时常为参数个数发愁。例如有的参数希望如果调用传值了就用所串的值,如果没有传值就不处理它。这里有道一个修饰符 params。如果个数不确定就用数组
params int[]number
循环比较思想
想找出一个集合中的之最,就用循环比较法,例如找一个数组中的最大值。这种编程思想可以应用的很多,要发散思维。
?private static int GetMax(int[] arr)
int max = arr[0];
for (int i = 0; i< arr.Length; i++)
if (max < arr[i])
max = arr[i];
return max;
保留小数位问题
有客户需求要保留两位小数,可是有的恰好就一位小数怎么办。这里用到format方法。string numStr = string.Format("0:0.00",2.3);
字符串处理
查找字符串中的字符
IndexOf(keyWord,index)返回值是字符所在索引,index 开始查询位置,keyWord是要查找的字符。
字符串切割与拼接方法
?
1、Split(new char[] ' ' , StringSplitOptions.RemoveEmptyEntries);
这是按照空格切成字符串数组,要注意后面的参数表示去掉空字符串。
2、string.Join(" ", text);拼接字符串 以空格连接字符串数组中元素
3、将字符串转化成字符数组 ToCharArray()
索引器的编写
有的一些对象可以像调用数组那样调用,例如person[0]。其实这是应为有“索引器”
public string this[int index]
get returnNames[index];
set Names[index] = value;
反向排序
反向拍序思想,以简单的数组为例。
1总结
这节没有将太多新知识,都是写小知识点。关于一些思想也是特简单的,但是要明白它们不止可以用于数组。也可以用于集合,比较对象的某个字段。
C#解决Linq OrderBy() 失效的小技巧
前言
前几天的一个数据列表中我用了Linq GroupBy 和OrderBy。 排序在本机正常使用,发到测试后排序死活不对,很是郁闷,总以为是程序问题。于是请教了另外一个同事。有了以下的答案。
问题原因和解决方法
因为服务器装的是英文版操作系统,没有中文包,所以碰见中文排序无法识别,所以使用OrderBy时需要单独处理下。
CultureInfo culture = CultureInfo.GetCultureInfo("zh-cn");
List<TeamDto> teamDtos = teams
.GroupBy(x => new
{
x.TestId,
x.TestName
})
.Select(g => new TeamDto()
{
TestID = g.Key.TestId,
Test = g.Key.TestName,
Teams = g.ToList()
})
.OrderBy(t=>t.Test,StringComparer.Create(culture,true))
.ToList();
以上是关于几个C#编程的小技巧的主要内容,如果未能解决你的问题,请参考以下文章