[教學]ASPX複製、更名會出現的錯誤和問題除錯

當你在寫ASP.net (ASPX)的網頁程式的時候,如果你的Visual Studio 2008 有出現以下的訊息:

錯誤訊息1BC30451名稱<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’ 未宣告。(中文版會出線的訊息)

 image001.png

錯誤訊息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.

錯誤訊息3BC30590找不到事件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,但好幾隻程式要複製貼上,看了不就頭暈了?

請看以下方法解決:

修正後置程式碼檔名

 image003.png

假設你開的專案叫做WebApplication1

程式叫做WebForm1

所以會有WebForm1.aspxWebForm1.aspx.vbWebForm1.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這一行

註:

  1. 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

 image005.png

按右鍵convert to application手動讓Visual Studio 2008重新產生WebForm1.designer.vb

 2010-01-18 01 23 27.png

這時候已經建立好控制項名稱定義了,再把程式碼貼回去即可

方法二

打開WebForm1.designer.vb檔,刪掉裡面的定義資訊,只剩下

Option Strict On

Option Explicit On

 

Partial Public Class WebForm1

 

End Class

 

然後重新編譯,看有沒有正確抓到控制項資訊,因這方法有時候還是會誤判

簡化除錯,使用「排除於專案」

有時候因為程式很多,或是程式沒寫完,但要急著測試內容,可以用以下方法做簡易除錯

在目標程式按Exclude From Project排除於專案,VS2008會將它視為普通檔案,不進行編譯

 image007.png

相反動作,在目標程式按Include From Project加入至專案

 image009.png

結論叫做,Visual Studio 2008有時候實在很鳥,常搞一些飛機,開發個專案也要弄得機犬不寧

如果以上方法有些複雜,就遵照盡量不要做程式檔案間的直接複製,用間段複製貼上來避免錯誤產生