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,呵呵