C# 中的“事件”是当对象满足一定条件,发生某些事情时,类向该类的客户提供通知的一种方法。使用事件,拥有该事件的对象不必知道需要通知谁,一旦满足了某个条件,将自动调用该事件,正确通知每个需要通知的对象。通过使用事件,提高了程序的模块化程度。
要在程序中使用自定义事件,需按以下步骤进行:
1、声明事件
要在类内声明事件,首先必须声明该事件的委托类型:
public delegate void SelectionChangedEventHandler(object sender,
SelectionChangedEventArgs e);
说明:由于本示例程序需在事件中传递数据,因此定义了EventArgs的派生类SelectionChangedEventArgs。
public class SelectionChangedEventArgs : EventArgs
{
private string m_selection;
//本属性用于传递事件数据
public string Selection
{
get { return m_selection; }
}
public SelectionChangedEventArgs(string selection)
{
m_selection = selection;
}
}
委托类型定义传递给处理该事件的方法的一组参数。多个事件可共享相同的委托类型,因此仅当尚未声明任何合适的委托类型时才需要执行该步骤。
接下来,声明事件本身:
public event SelectionChangedEventHandler SelectionChanged;
2、调用事件
如果没有任何客户将委托与该事件挂钩,该字段将为空;否则该字段引用应在调用该事件时调用的委托。因此,调用事件时通常先检查是否为空,然后再调用事件。
public class Form2 : System.Windows.Forms.Form
{
... ...
public event SelectionChangedEventHandler SelectionChanged;
... ...
private void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
if (SelectionChanged != null)
{
SelectionChangedEventArgs E = new SelectionChangedEventArgs(comboBox1.Text);
SelectionChanged(this, E);
}
}
}
3、与事件挂钩
为了开始接收事件调用,客户代码先创建事件类型的委托,该委托引用应从事件调用的方法。然后它使用 += 将该委托写到事件可能连接到的其他任何委托上。
public class Form1 : System.Windows.Forms.Form
{
... ...
private Form2 m_frm2;
... ...
public Form1()
{
... ...
m_frm2 = new Form2();
//与事件挂钩
m_frm2.SelectionChanged += new SelectionChangedEventHandler(frm2_SelectionChanged);
}
... ...
private void button1_Click(object sender, System.EventArgs e)
{
m_frm2.ShowDialog();
}
private void frm2_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
//获取事件传递过来的数据
textBox1.Text = e.Selection;
}
}
错误 1 “GenerateResource”任务意外失败。
System.Reflection.ReflectionTypeLoadException: 无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。
在 Microsoft.Build.Shared.ExceptionHandling.RethrowUnlessFileIO(Exception e)
在 Microsoft.Build.Tasks.GenerateResource.NeedSeparateAppDomain()
在 Microsoft.Build.Tasks.GenerateResource.Execute()
在 Microsoft.Build.BuildEngine.TaskEngine.ExecuteTask(ExecutionMode howToExecuteTask, Hashtable projectItemsAvailableToTask, BuildPropertyGroup projectPropertiesAvailableToTask, Boolean& taskClassWasFound)
vs.net 2005保存时报这样的错误,之前所作的是更改了窗体的背景图片,不知所云,关了vs.net 2005,重新打开又好了,莫名其妙,啥子原因?
偷来的知识 嘿嘿
document.getElementById("apple") 以ID来访问对象,且一个ID在页面中必须是唯一的
document.getElementsByTagName("div")[0] 以标签名来访问对象
1.setAttribute(string name, string value):增加一个指定名称和值的新属性,或者把一个现有的属性设定为指定的值。
设置对象的属性则应该采用:
document.getElementById("apple").setAttribute("width","100")
document.getElementsByTagName("div")[0].setAttribute("width","100")
访问对象的属性则采用:
document.getElementById("apple").getAttribute("width")
document.getElementsByTagName("div")[0].getAttribute("width")
我们经常需要在JavaScript中给Element动态添加各种属性,这可以通过使用setAttribute()来实现,这就涉及到了浏览器的兼容性问题。
var bar = document.getElementById("foo");
bar.setAttribute("onclick", "javascript:alert('This is a test!');");
这里利用setAttribute指定e的onclick属性,简单,很好理解。但是IE不支持,IE并不是不支持setAttribute这个函数,
而是不支持用setAttribute设置某些属性,例如对象属性、集合属性、事件属性,也就是说用setAttribute设置style和onclick这些属性
在IE中是行不通的。为达到兼容各种浏览器的效果,可以用点符号法来设置Element的对象属性、集合属性和事件属性。
document.getElementById("foo").className = "fruit";
document.getElementById("foo").style.cssText = "color: #00f;";
document.getElementById("foo").style.color = "#00f";
document.getElementById("foo").onclick= function () { alert("This is a test!"); }
2、关于class和className
class属性在W3C DOM中扮演着很重要的角色,但由于浏览器差异性仍然存在。使用setAttribute("class", vName)语句动态设置
Element的class属性在firefox中是行的通的,在IE中却不行。因为使用IE内核的浏览器不认识"class",要改用"className";
同样,firefox 也不认识"className"。所以常用的方法是二者兼备:
element.setAttribute("class", vName);
element.setAttribute("className", vName); //for IE
关于IE下TABLE无法插入新行的问题
IE下TABLE无论是用innerHTML还是appendChild插入<tr>都没有效果,而其他浏览器却显示正常。解决他的方法是,将<tr>加到TABLE的<tbody>元素中,如下面所示:
var row = document.createElement("tr");
var cell = document.createElement("td");
var cell_text = document.createTextNode("香蕉不吃苹果");
cell.appendChild(cell_text);
row.appendChild(cell);
document.getElementsByTagName("tbody")[0].appendChild(row);
window.event
IE:有window.event对象
FF:没有window.event对象。可以通过给函数的参数传递event对象。如onmousemove=doMouseMove(event)
鼠标当前坐标
IE:event.x和event.y。
FF:event.pageX和event.pageY。
通用:两者都有event.clientX和event.clientY属性。
鼠标当前坐标(加上滚动条滚过的距离)
IE:event.offsetX和event.offsetY。
FF:event.layerX和event.layerY。
标签的x和y的坐标位置:style.posLeft 和 style.posTop
IE:有。
FF:没有。
通用:object.offsetLeft 和 object.offsetTop。
窗体的高度和宽度
IE:document.body.offsetWidth和document.body.offsetHeight。注意:此时页面一定要有body标签。
FF:window.innerWidth和window.innerHegiht,以及document.documentElement.clientWidth和document.documentElement.clientHeight。
通用:document.body.clientWidth和document.body.clientHeight。
添加事件
IE:element.attachEvent("onclick", func);。
FF:element.addEventListener("click", func, true)。
通用:element.onclick=func。虽然都可以使用onclick事件,但是onclick和上面两种方法的效果是不一样的, onclick只有执行一个过程,而attachEvent和addEventListener执行的是一个过程列表,也就是多个过程。例如: element.attachEvent("onclick", func1);element.attachEvent("onclick", func2)这样func1和func2都会被执行。
标签的自定义属性
IE:如果给标签div1定义了一个属性value,可以div1.value和div1["value"]取得该值。
FF:不能用div1.value和div1["value"]取。
通用:div1.getAttribute("value")。
父节点、子节点和删除节点
IE:parentElement、parement.children,element.romoveNode(true)。
FF:parentNode、parentNode.childNodes,node.parentNode.removeChild(node)。
CSS:透明
IE:filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)。
FF:opacity:0.6。
设置CSS 的STYLE
document.getElementById('look').style.cssText="display:none;";//通用
document.getElementById('look').setAttribute("style","display:none;");//firefox
哈哈 ,周五的晚上,明天周末,有些松懈
这是今天晚上唯一的成果
执行SqlTranaction成功了
下面的错误不是执行事务的关系
见到 “将截断字符串或二进制数据。\r\n语句已终止。”的错误信息开始有些不知所措,在网上查,原来是超了数据库字段长度所致,调整数据库字段长度,果然如此。
好长时间不用vs.net刚开始都不知道怎么查看运行中变量的信息,突然想起来在 即时窗口中 输入 “ ? 变量名” 然后回车,会输出当前这个变量的值
哈哈 ,还是有点印象的嘛。
? ex
{"将截断字符串或二进制数据。\r\n语句已终止。"}
[System.Data.SqlClient.SqlException]: {"将截断字符串或二进制数据。\r\n语句已终止。"}
Data: {System.Collections.ListDictionaryInternal}
HelpLink: null
InnerException: null
Message: "将截断字符串或二进制数据。\r\n语句已终止。"
Source: ".Net SqlClient Data Provider"
StackTrace: " 在 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)\r\n 在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)\r\n 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)\r\n 在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)\r\n 在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)\r\n 在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)\r\n 在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)\r\n 在 System.Data.SqlClient.SqlCommand.InternalExecuteNonQu
ery(DbAsyncResult result, String methodName, Boolean sendToPipe)\r\n 在 System.Data.SqlClient.SqlCommand.ExecuteNonQuery()\r\n 在 psms.DBUtility.SqlHelper.ExecuteNonQuery(SqlTransaction trans, CommandType cmdType, String cmdText, SqlParameter[] commandParameters) 位置 D:\\network\\psms\\DBUtility\\SQLHelper.cs:行号 91\r\n 在 psms.SQLServerDAL.InTable.insertInTable(InTableInfo data) 位置 D:\\network\\psms\\SQLServerDAL\\InTable.cs:行号 152"
TargetSite: {Void OnError(System.Data.SqlClient.SqlException, Boolean)}
Oracle insert大字符串方法
try {
conn = getConnection();
pstmt = conn
.prepareStatement("Insert into offidutychk(decno,offino,checkdate,checkcontent) "+
"Values(seq_decno.nextval, ?,?,?)");
pstmt.setString(1, hezhi.getOffino());
pstmt.setDate(2, hezhi.getCheckDate());
pstmt.setCharacterStream(3,
new InputStreamReader(new ByteArrayInputStream(hezhi.getCheckContent().getBytes())), hezhi.getCheckContent().length());
//pstmt.setString(3, hezhi.getCheckContent());
// 判断插入操作是否成功
if (pstmt.executeUpdate() == 1)
succ = true;
else
succ = false;
} catch (Exception e) {
succ = false;
e.printStackTrace();
} finally {
try {
pstmt.close();
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
}
closeConnection(conn);
}
Oracle update大字符串方法
Connection conn = null;
PreparedStatement pstmt = null;
int length=hezhi.getCheckContent().length();
String s1="";
String s2="";
if(length>1000){
s1=hezhi.getCheckContent().substring(0,1000);
s2=hezhi.getCheckContent().substring(1000,length);
}else{
s1=hezhi.getCheckContent();
}
try {
conn = getConnection();
pstmt = conn
.prepareStatement("update offidutychk set checkdate=?,checkcontent=?||? "+
"where decno=?");
pstmt.setDate(1, hezhi.getCheckDate());
// pstmt.setCharacterStream(2,
// new InputStreamReader(new ByteArrayInputStream(hezhi.getCheckContent().getBytes())), hezhi.getCheckContent().length());
// //pstmt.setString(2, hezhi.getCheckContent());
pstmt.setString(2, s1);
pstmt.setString(3, s2);
pstmt.setInt(4, hezhi.getDecno());
// 判断更新操作是否成功
if (pstmt.executeUpdate() == 1)
succ = true;
else
succ = false;
} catch (Exception e) {
succ = false;
e.printStackTrace();
} finally {
try {
pstmt.close();
} catch (Exception e) {
e.printStackTrace();
}
closeConnection(conn);
}
扔了一年多的C#因为要做个东西,又拾起来了,跟原来不同的是现在用vs.2005了,用2003的时候就时刻关注着2005的发布,现在用2005了,好像又要出什么2008了,唉...跟不上脚步啊
记录一个小问题吧,在绑定ComboBox的时候想动态改变选定的值
原以为 comboBox.SelectItem = "":就行了
不灵,遂在网上查,原来要这么写
this.cob.SelectedItem = this.cob.Items[this.cob.FindString(" 选定的值")];
这大圈绕的......
记下来,以备后患 呵呵
接着干活.......
ERROR (StandardManager.java:638) - Exception loading sessions from persistent storage
ERROR (StandardManager.java:372) - IOException while loading persisted sessions: java.io.EOFException
启动Tomcat报错
网上搜,说因为tomcat上次没有正常关闭,EOFException表示输入过程中意外地到达文件尾或流尾的信号,导致从session中获取数据失败。把 work\Catalina\localhost\应用名\sessions.ser文件删除,OK
在apache-tomcat-5.5.17使用Struts Tag会抛出Failer to load or instantiate TagExtraInfo class:org.apache.struts.taglib.bean.CookieTei的异常
解决方法:删除WEB_INF/lib/javax.servlet.jsp.jar。(jsp jar包会引起冲突)
好久没写日志了,今天饶有兴趣上来baidu,发现登录不了,我用的是傲游,转到Ie还是登录不了,而换到FireFox就很顺利地打开了,我晕
还发现google帐户也不能访问,再晕,难道我的Ie坏了?中毒了?只能这么想,也不能baidu和google把Ie给封了啊,呵呵,问题查找中
今天来了兴趣,装了个eclipse的汉化包和 vss for eclipse的插件
开始不知为何老加载不上,在网上查把configuration文件夹删了,让eclipse重建,好,删,Shift+Delete,按下回车的那一刻后悔了,这要是不行就完蛋了,果不其然,eclipse起不来了,我晕
将eclipse文件夹重新覆盖
打开发现不是MyEclipse原来的字体了,用习惯了看着别扭
在字体中找啊找,看着哪个也不像,索性打开Myeclipse找到里面的字体原来是,Courier New
在eclipse中设置字体
对于局域网内的朋友共享设置一直都比较麻烦的事情,关闭共享,又不知道如何为更安全的关闭,开启共享更担心共享安全性问题,这个小工具 方便大家的共享设置.
内附上设置原理,有兴趣的朋友也可以手动设置
关闭局域网共享
开通局域网共享(访问本机无需验证即可进入)
开通局域网共享(访问本机需填用户名及密码)
局域网互访第一关卡:
系统默认:利用IPC$通道可以建立空连接,匿名枚举出该机有多少帐户.显然有一定的安全隐患黑客可以利用扫描器,找到开放IPC$共享的电脑,匿名枚举出该机的所有用户帐号,如果用户的帐号不设密码,则容易被入侵.
建议禁止空连接.这样即使用户不设密码,上网也不会有多大的风险.但会影响到局域网互访.
局域网互访第二关卡:
本地安全策略-安全选项-帐户:使用空白密码的本地帐户只允许进行控制台登录.系统默认值是:已启用.说明:很多人的帐户并没有加密码.这样,当局域网中 别的电脑访问本机时,会弹出错误提示:登录失败:用户帐户限制......这是XP系统的一条安全策略造成的,防止别人趁你空密码时进入你的电脑.如果您 的电脑是家用的,没必要设密码,那就应把它设为:已停用.
局域网互访第三关卡:
控制面板-防火墙-例外-文件和打印机共享系统默认:不选.说明:所有的策略都设置好了,局域网依然不能访问,提示:您没有权限使用网络资源,找不到网络路径!这是因为XP还有一道关卡,就是防火墙,必须要经过防火墙的允许才行.
知识普及:
IPC$入侵是黑客惯用的手段.IPC$漏洞不能穿越路由器,所以用路由器上网的用户不必担心开放了局域网共享会有什么隐患.但要注意:路由器会被人扫描并窃取保存在里面的ADSL帐号密码.所以也不要大意,赶快把路由器默认的用户名和密码改掉.
下载地址
//**读取properties配置文件的类
import java.util.*;
import java.io.*;
public final class ParseProperties {
private static Properties properties = null;
private ParseProperties() {
}
public static String getProperties(String propStr){
if(properties==null){
try{
InputStream is=ParseProperties.class.getClassLoader().getResourceAsStream("runqianServ.properties");
properties = new Properties();
properties.load(is);
is.close();
}catch(Exception e){
e.printStackTrace();
}
}
return properties.getProperty(propStr);
}
public static void main(String[] args) {
String driver=ParseProperties.getProperties("runqianServ");
System.out.println(driver);
}
}
在apache-tomcat-5.5.17使用Struts Tag会抛出Failer to load or instantiate TagExtraInfo class:org.apache.struts.taglib.bean.CookieTei的异常。(这只是bean标签,其它标签异常略)
解决方法:删除WEB_INF/lib/javax.servlet.jsp.jar。(jsp jar包会引起冲突)
对于javascript框架一直再用DWR,昨天听人说了个JQuery,不知道什么东西,在网上一查,也是个javascript框架,看论坛上的帖子好像功能还挺强大,落伍喽,就知道个DWR
这不这两天就在折腾这东西,今天终于看到效果了
下面是用DWR动态向table中添加行,并且设定行的css属性,比较爽,呵呵
function returnQueryRpt(list){
var cellfuncs = [
function(data){return data[1];},
function(data){
var id = data[0];
var rqname = data[2];
return "<a href=\"javascript:printReport('" + rqname + "','" + id + "')\"><img src=\"<%=path%>/images/pic_edit.gif\" alt=\"填报或修改\" width=\"16\" height=\"16\" border=\"0\"></a>";
}
];
DWRUtil.removeAllRows('addRowsBasic');
DWRUtil.addRows('addRowsBasic',list,cellfuncs,{
rowCreator:function(options) {
var row = document.createElement("tr");
row.setAttribute("id",options.rowData.id);
return row;
},
cellCreator:function(options) {
var td = document.createElement("td");
td.style.color = "#003366";
if(options.rowIndex%2==0){
td.style.backgroundColor = "#F5f5f5";
}else{
td.style.backgroundColor = "#E6EEF7";
}
return td;
}
});
}
****************************************************************************************************************
2008-01-15补充
今天更新成了dwr2.0.2
有以下改动
1、首先启动报错
- Marking servlet dwr-invoker as unavailable
- Error loading WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@9fdee
uk.ltd.getahead.dwr.DWRServlet
java.lang.ClassNotFoundException: uk.ltd.getahead.dwr.DWRServlet
dwr官方网站有如下解释
The DWR package has changed from uk.ltd.getahead to org.directwebremoting. There are deprecated stubs in place for backwards compatibility, however more future proof code will use the new package names. The change that will affect most people is the altered servlet name. The preferred name is now: org.directwebremoting.servlet.DwrServlet
改成<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>就OK了
2、上面的例子如果直接升级到2.0会直接出来html代码
要加上下面这句
dwr.util._escapeHtml = false;
如果为true,就直接
出来html代码
3、
DWRUtil 改成了 dwr.util
看看与上次写东西的时间跨度,好家伙,整整三个月了,这三个月都极少上网了,极少登录了,最主要的原因是公司把外网给断了,没有明确的理由,就这样,网络离我远了很多,毕竟一天里大多的时间是在公司嘛
这三个月,经过了很多事情,最大的一件是我结婚了,哈哈,想想,之前和之后,也没什么变化嘛,还是在路上、干活、 吃喝拉撒睡,大家听说我结婚了都很吃惊,这就是效率,呵呵!大家祝福我吧,嘻嘻!
说现在为啥能上了呢,哈哈,不知哪位高人偷偷“挖了个隧道”偷偷上网,哈哈,咱也偷偷沾个光,希望这地下工作能长久维持啊!
工作方面,感觉老摆弄那些死沉滥调的代码也没什么意思,想学点新东西
在研究struts2,呵呵