當你在寫ASP.net (ASPX)的網頁程式的時候,如果你的Visual Studio 2008 有出現以下的訊息:
錯誤訊息1:BC30451名稱<xxx控制項>未宣告
WebApplication1WebForm1.aspx.vb(7) :error BC30506: Handles clause requires a WithEvents variable defined in the containing type or one of its base types.
WebApplication1WebForm1.aspx.vb(9) :error error BC30451: Name ‘ TextBox1’ is not declared.
WebApplication1WebForm1.aspx.vb(9) :error BC30451: 名稱 ‘ TextBox1’ 未宣告。(中文版會出線的訊息)
錯誤訊息2: BC30269 Protected Sub Page_Load有多個具相同簽章的定義
WebApplication1Default1.aspx.vb(4) : error BC30269: ‘Protected Sub Page_Load(sender As Object, e As System.EventArgs)’ has multiple definitions with identical signatures.
WebApplication1Default.aspx.designer.vb(25) : error BC30260: ‘form1’ is already declared as ‘Protected WithEvents form1 As System.Web.UI.HtmlControls.HtmlForm’ in this class.
錯誤訊息3:BC30590找不到事件Load
WebApplication1WebForm1.aspx.vb(3) : error BC30590: Event ‘Load’ cannot be found.
錯誤訊息4:
Server Error in ‘/’ Application.
Parser Error
錯誤訊息5:
Server Error in ‘/’ Application.
A page can have only one server-side Form tag.
重點就是這幾句,BC30451名稱<xxx控制項>未宣告
BC30269 Protected Sub Page_Load有多個具相同簽章的定義
連網友也有差不多的問題
http://social.msdn.microsoft.com/Forums/zh-TW/236/thread/a028d66b-5bd6-40c0-bd9f-06e146cebd3b
心想,他OOXX的,隨便拉個TextBox都會有問題?
明明Page_Load裡面是空的,為何還會有這問題?
大部分都是在以下情形會產生這些問題:
- 複製程式檔案〈你維護好的一隻程式,想說直接用COPY的方式,馬上再改另一隻〉
- 檔案直接重新命名,而相關資訊沒有一併修改〈請見下文修正控制項宣告〉
- 組員寫的程式,要整合到專案中
遇到這囧況,我想大家都會憤而砸電腦吧。
這問題詢問老師,老師會跟你說
畫面上出現的控制項重拉,或是盡量不要做程式檔案間的直接複製,用間段複製貼上來避免錯誤產生
怎麼可能,畫面弄個10多個控制項不為過,重拉控制項,對於用精靈接資料庫的初學者而言,不就等於重做了嗎?
間段複製貼上是OK,但好幾隻程式要複製貼上,看了不就頭暈了?
請看以下方法解決:
修正後置程式碼檔名
假設你開的專案叫做WebApplication1
程式叫做WebForm1
所以會有WebForm1.aspx、WebForm1.aspx.vb、WebForm1.designer.vb三個檔案
請確認
WebForm1.aspx檔案中
<%@ Page Language=”vb” AutoEventWireup=”false” CodeBehind=”WebForm1.aspx.vb” Inherits=”WebApplication1.WebForm1“ %> <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” > <head runat=”server”> <title>Untitled Page</title> </head> <body> <form id=”form1″ runat=”server”> <div>
</div> </form> </body> </html>
|
- Ø CodeBehind=” WebForm1.aspx.vb”是否為後置程式碼的檔名,且和其他檔名相異
- Ø Inherits=” WebApplication1. WebForm1“是否為該專案名稱「點」程式名稱
- Ø 整個網頁是否只有一對<form id=”form1″ runat=”server”> </form>標籤
WebForm1.aspx.vb檔案中
Public Partial Class WebForm1 Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
End Sub
End Class |
- Ø Class WebForm1是否為後置程式碼的檔名
- Ø 是否有Inherits這一行
註:
- class名稱須為跟檔名相同,所以這裡的class名要和檔名,程式碼檔案裡的class名稱三者都需相同
2. Class _Default只會有一個,如果重覆的話會出現錯誤訊息2的錯誤
3. form標籤若有1個以上,會有錯誤訊息4的錯誤
修正控制項宣告
假設要修正程式叫做WebForm1
而出現錯誤訊息1就是WebForm1.designer.vb裡沒有宣告好前端所拉的控制項。
有二種方法可修正
方法一〈較穩定〉
把WebForm1.aspx.vb中多寫的程式碼移走,剩下預設有的資料
Public Partial Class WebForm1 Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
End Sub
End Class |
刪掉WebForm1.designer.vb檔,然後按右鍵convert to application手動讓IDE重新產生WebForm1.designer.vb檔
按右鍵convert to application手動讓Visual Studio 2008重新產生WebForm1.designer.vb檔
這時候已經建立好控制項名稱定義了,再把程式碼貼回去即可
方法二
打開WebForm1.designer.vb檔,刪掉裡面的定義資訊,只剩下
Option Strict On Option Explicit On
Partial Public Class WebForm1
End Class
|
然後重新編譯,看有沒有正確抓到控制項資訊,因這方法有時候還是會誤判
簡化除錯,使用「排除於專案」
有時候因為程式很多,或是程式沒寫完,但要急著測試內容,可以用以下方法做簡易除錯
在目標程式按Exclude From Project排除於專案,VS2008會將它視為普通檔案,不進行編譯
相反動作,在目標程式按Include From Project加入至專案
結論叫做,Visual Studio 2008有時候實在很鳥,常搞一些飛機,開發個專案也要弄得機犬不寧
如果以上方法有些複雜,就遵照盡量不要做程式檔案間的直接複製,用間段複製貼上來避免錯誤產生。