WPF将控件转化为图像

在项目中需要将datagrid这个控件转化成图像输出,思考了几种办法:

1.可以对屏幕截取,然后再根据控件相对于屏幕的坐标再次截取,即可取得控件截图。这种方法限制性很大,如图像的分辨率被限死,同时,如果控件不在屏幕中显示的话那么就无法进行截图。

2.查看datagrid源码,重新绘制图形。这个办法只要掌握,其实一劳永逸。只不过需要时间过长,略显复杂,项目中需要一种简洁的方法来操作。

3.有自带方法绘制控件。经过查阅资料,整理代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/// <summary>
/// 可以对WPF中的控件抓取为图片形式.
/// </summary>
/// <param name="p_FrameworkElement">控件对象</param>
/// <param name="p_FileName">生成图片的路径</param>
private void SaveToImage(FrameworkElement p_FrameworkElement, string p_FileName)
{
System.IO.FileStream fs = new System.IO.FileStream(p_FileName, System.IO.FileMode.Create);
RenderTargetBitmap bmp = new RenderTargetBitmap((int)p_FrameworkElement.ActualWidth, (int)p_FrameworkElement.ActualHeight, 96.0, 96.0, PixelFormats.Pbgra32);
bmp.Render(p_FrameworkElement);
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bmp));
encoder.Save(fs);
fs.Close();
fs.Dispose();
}
阅读更多

c#约瑟夫环

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

例如:

n = 9, k = 1, m = 5

【解答】

出局人的顺序为5, 1, 7, 4, 3, 6, 9, 2, 8。

阅读更多

C#窗体间传值

关于C#窗体间的数据传值的方法好几种,在项目中都各有应用,虽然简单,这里记录下来,分享给大家!

一、使用带参数的构造函数

主窗体

1
2
3
4
5
6
private void button_Click(object sender, System.EventArgs e)
{
// 将主窗体的控件值作为参数传递到子窗体
Form2 formChild = new Form2(this.textBoxFrm1.Text, this.checkBoxFrm1.Checked);
formChild.ShowDialog();
}

子窗体(Form2)

阅读更多

Asp.net笔记(2)

  1. Aspx中使用cs中的函数及成员时需要注意该函数类型为protected或者public

  2. Asp.net的服务端控件和客户端控件ID不见得一样。服务端控件在内网环境和后台环境下使用是很方便的。而HTML控件用于前台。物尽其用。

  3. 获取客户端控件ID方法: 服务端id.ClientID

document.getElementById(‘<%=TextBox1.ClientID%>’)

JQuery同理。

  1. Aspx中asp标签的控件的css样式:CssClass=”…”,等同于HTML中class属性。也可以单独修改控件样式,但不建议这样做。会生成大量冗余代码。

  2. 控件的Attributes用于设置控件的额外属性。

  3. Label渲染成Span,若设置了AssociateControlID属性,就渲染成label,且for属性为关联的控件id。

  4. Literal不做任何渲染,就是文本。将其mode属性设置为encode后,可以自动对文本进行编码,防止xss漏洞。

  5. TextBox控件的AutoPostBack属性为true时,当该控件失去焦点,就自动Post。ASP.net中要提交表单时最好使用_doPostBack()方法。

  6. RadioButton渲染为 input type=”radio”, 通过GroupName进行分组。

  7. Button等控件可以通过Command以及CommandName,CommandArgument来统一处理。

  8. Panel是容器,如果GroupingText的属性设置了,就渲染成有filedset的div,否则直接为div

  9. HyperLink,能将虚拟路径转化为客户端路径。

  10. FileUpload控件使用说明:需要增加上传文件的类型及权限。防止恶意攻击。

  11. Jquery使用注意:$(“#<%=TextBox1.ClientID%>”).val() 只有<%%>里的是服务端代码。

  12. 控件的display:none和visibility:hidden都能实现隐藏,区别是:display:none不占空间

  13. 页面中的IsValid属性用来判断所有验证控件是否验证完成

  14. 控件的CausesVilidation属性为false则该控件不能被验证控件验证。

Asp.net笔记(1)

  1. Get和post区别
  • Get通过url显式传递参数,参数传递长度有限

  • Post隐式传递,可以传递数据量较大的数据

  1. 表单只可提交有name 的input 、select、textarea的value。对于不能提交value的,例如div。可以用hidden类型的input代替传送。这就是ASP.NET的viewstate机制的由来。

  2. 大量的数据不能存储在hidden或者viewstate中,会增加上传流量,导致网页速度变慢。同时表单中不能存储机密数据,会造成数据欺骗。

  3. 后台变量不能保存B端的值,对此引用session机制与cookie。Session是B端用户相关信息与S端内存的对应关系。Cookie将这些信息数据保存在本地。Session中不能存储过大的数据,并且超过一段时间会自动清除。例如在线编辑文章,编辑时间过长导致提交时出现文章提交失败,超时或者丢失。优化网页案例:网站主站域名与音乐站,图像站等大流量子站域名区分开,防止cookie的大量提交更新。

  4. 每一个请求都会new一个实现了IHttpHandler接口的类的实例进行处理,用完后就GC,不会保留。

  5. JS作为客户端校验能方便用户,但js被禁用后会引起不必要的麻烦,所以数据限制等功能还要在服务端做处理。

  6. asp:Button标签中 OnClientClick为客户端点击事件,onclick是服务端点击事件。

  7. VirtrualPathUtility虚拟路径方法:

  • ToAbsolute(“/ex.aspx”) 将虚拟路径/ex.aspx转换为绝对路径

  • AppendTrailingSlash(“”) 判断虚拟路径最后是否有/,如果没有就加上

  • Combine(“”,””) 合并两路径,需要注意路径一的末尾如果没有/就找到最后一个/处进行合并,例如Combine(“/a/b”,”c.html”)合并为/a/c.html

  1. Response对象:
阅读更多

甘肃软考报考/领证指南

注: 本文部分引用自Kaavield 的空间,由于Kaavield 的帮助然我领证少走了很多弯路,不过Kaavield 的指南出点小问题,我这里补全。

1.报考

(1) 网络报名

密切关注甘肃省人事编制信息网的通知,一般上半年在3月左右报名,下半年9月左右。看到通知后根据通知的时间,网址进行在线报名。往年报名网址是在甘肃人事网上报名系统中,但是2011年上半年转移到了中国计算机技术职业资格网。不知道以后会不会还有变化,因为甘肃好像就没有什么正规的 软考办公室,所有职称考试都在职改办处理。对此不想再发表意见。 网上报名需要网银支持,费用由以前的80涨到了100,再有100涨到了140……恩,肉价菜价涨了,这个也涨,很好……

(2) 网下报名

阅读更多

由装饰模式巩固继承

最近学习《大话设计模式》,在学习的过程中又加深了对OO的理解,诸如abstract和virtual的区别之类的问题有了清晰的认识。今天通过装饰模式,重温OO的继承,巩固子类于父类的构造函数调用,子类调用父类方法等问题。

先看一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Person
{
public Person()
{
Console.WriteLine("Person“);
}
}
class Man : Person
{
public Man()
{
Console.WriteLine("Man");
}

}

然后我们在主函数中实例化子类Man

1
Man jack = new Man();
阅读更多

程序集

Assembly即程序集是一个由类型定义、数据文件和资源文件组成的逻辑集合。每个程序集都包含一个程序集清单,该清单通常被附加在某个头文件上,也可以设置单独建立一个文件来包含该清单。

在编译程序集中间代码之前,CLR需要找到合适的程序集中间代码,其加载机制分为主动加载方式与通过名称、版本、文化和公钥来加载程序集。

1. 程序集的主动加载方式:

程序集的加载可以完全忽略任何策略,由程序员在程序中显式的通过位置加载。System.Reflection.Assembly.LoadFrom提供了这个功能。此方法通过接收一个codebase风格的字符串,用以确定所要加载程序集的位置:

1
2
3
4
5
String codebase = @"../../../example/Compile/Compile.dll";

Assembly mycompile = Assembly.LoadForm(codebase);

Object compile = mycompile.CreateInstance("***.Compile");
阅读更多

CTS、CLI、CLS和CLR

CTS、CLS和CLR是.Net框架的基本概念,但往往成为程序员忽视的部分。

CLR即Common Language Runtime, 可以把CLR理解为一个包含运行.Net程序的引擎和一些符合公共语言基础结构的类库的集合。它是一个规范的CLI实现。所谓的.Net框架一般就是指公共语言运行库。

CLI公共语言基础,是微软向ECMA提交的一份语言和数据格式规范(包括了CTS,中间语言CIL、底部文件格式和元数据格式等),它是目前为止,唯一一个公共语言基础的实现版本。

CTS的全称为Common Type System 通用类型系统。定义了一个能够在CLR上运行的语言规范,需要注意的是,尽管很多语言本省不符合CTS规范,但通过加强编译器,改变语言附加规范等手段,使得许多语言能够编写出在CLR上运行的程序,比如C++

CLS公共语言规范是CTS的一个子集,它定义了希望编写在.Net平台上运行的程序的语言所需符合的最小的规范。因为.Net允许由不同语言编写的程序一起运行,所以制定出CLS规范。

阅读更多

Eclipse整合GlassFish编写JSP

学校开了J2EE的选修,老师讲课的起点有点高,对于我们没有什么web认识的学生来说,一开始就讲jsp,实在是听的人雨里雾里。琢磨了一下午的tomcat,还是不能正常启动。没办法,尝试了一下glassfish。

先是在oracle的网站down了最新的java ee sdk,里面就带了glassfish,安装的时候做了一些基本的配置。启动startserv后打开 127.0.0.1:8080,显示如下,证明服务已启动。不过手动启动觉得有点麻烦,eclipse能整合到glassfish就方便多了,于是查找了一些方法。

我使用的eclipse是Eclipse IDE for Java EE Developers,下载地址:http://www.eclipse.org/downloads/

打开eclipse—windows—preferences—server—-runtime environments,然后点add,出现以下界面

阅读更多