Morsning Synnerligen enkelt svar faktiskt. Det bevisar att du ställt frågan på ett rätt sätt anser jag. jo jag antog att det var problemet. Nej, aspx sidan ärver ju från codebehind klassen, detta sker före något händer i aspx-filen. alltså. Det enklaste är att skapa tabellen och dessutom lägger på ett dataset med hjälp av designläget för aspx-filen. jag vill inte ha det enkelt. Det finns detaljerade beskrivningar på msdn.microsoft.com och i VS.NET dokumentationen. har jag givetvis gjort. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbconWebFormsCodeModel.aspCodeBehind
Jag försöker skapa en codebehind sida. Men jag får följande fel:
System.NullReferenceException: Object reference not set to an instance of an object.
Line 39: Dim dt As DataTable = ds.Tables(0)
Line 40:
Line 41: mList.DataSource = dt <---- this line
Line 42: mList.DataBind()
Line 43:
aspx:
<%@ Page Language="vb" CodeBehind="Test.vb" Inherits="Test" Src="Test.vb" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>WebForm1</title>
<meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">
<meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</head>
<body MS_POSITIONING="GridLayout">
<form action="WebForm1.aspx" method="post" runat="server" ID="Form1">
<asp:DataGrid ID="mList">
<Columns>
<asp:BoundColumn DataField="name"></asp:BoundColumn>
<asp:BoundColumn DataField="caseid"></asp:BoundColumn>
</Columns>
</asp:DataGrid>
</form>
</body>
</html>
vb:
Imports Microsoft.Data.Odbc
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.HtmlControls
Imports System.Data
Public Class WebForm1
Inherits System.Web.UI.Page
Public mList As System.Web.UI.WebControls.DataGrid
#Region " Web Form Designer Generated Code "
'This call is required by the Web Form Designer.
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
End Sub
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: This method call is required by the Web Form Designer
'Do not modify it using the code editor.
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
Dim cmd As OdbcCommand
Dim sql As String = "SELECT name,caseid FROM case_info"
Dim conStr As String = "driver={MySQL};server=sql3;uid=root;database=support3;OPTION=17923"
Dim da As OdbcDataAdapter = New OdbcDataAdapter(sql, conStr)
Dim ds As New DataSet()
da.Fill(ds, "case_info")
'dim bldr as
Dim dt As DataTable = ds.Tables(0)
mList.DataSource = dt
mList.DataBind()
End Sub
End ClassSv: CodeBehind
Du har inte gjort någon instans av objektet dt (DataTable). Tala om att du vill att datatablen ska tillhöra ditt dataset.
dt = New DataTable
dataset.tables.add(dt)
//Mikael.NETSv: CodeBehind
Dim dt As DataTable = ds.Tables(0)
den raden skapar väl objectet DT och tilldelar den resultatet av ds.Tables(0)Sv: CodeBehind
Men mList är ju skapad i aspx sidan. Och eftersom det är en CodeBehind sida borde den existera i .vb sidan också, right?Sv: CodeBehind
Om du skapar kontrollen med designern så kommer den att skapa en instans i InitializeComponent (via Page_Init händelsen).
Antingen så ändrar du till:
Protected WithEvents mList As New DataGrid
eller så får du skapa instansen före du använder den i Page_Load.
/TommySv: CodeBehind
1. Test.vb klassen ärver System.Web.UI.Page
2. I test.vb skapar man en ny datagrid som heter mList
3. WebForm1.aspx ärver test klassen och då refererar alltså mList i aspx sidan till mList som man har skapat i Test klassen. eller?
Vill du vara vänlig och göra ett litet exempel, jag får det inte att fungera..Sv: CodeBehind
mList är ett (dvs samma) objekt i aspx & codebehind filerna. Designern deklarerar objekten med WithEvents för att man skall kunna ta hand om händelser i codebehind-klassen.
/Tommy
Public Class GridDemo
Inherits System.Web.UI.Page
Protected WithEvents myDataSet As System.Data.DataSet
Protected WithEvents myDataGrid As System.Web.UI.WebControls.DataGrid
#Region " Web Form Designer Generated Code "
'This call is required by the Web Form Designer.
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.myDataSet = New System.Data.DataSet()
CType(Me.myDataSet, System.ComponentModel.ISupportInitialize).BeginInit()
'
'myDataSet
'
Me.myDataSet.DataSetName = "NewDataSet"
Me.myDataSet.Locale = New System.Globalization.CultureInfo("sv-SE")
CType(Me.myDataSet, System.ComponentModel.ISupportInitialize).EndInit()
End Sub
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: This method call is required by the Web Form Designer
'Do not modify it using the code editor.
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
End Sub
End ClassSv: CodeBehind
Jag vill göra sakerna själv och veta hur det hela fungerar bakom kulisserna.
Som jag har fatta det så ärver min klass System.Web.UI.Page och aspx sidan ärver min klass. Eller har jag fel?
Vilken ordning laddas de olika klasserna?
1. UI.Page
2. Klassen
3. AspX sidan
om det är den ordningen så förstår jag att man måste använda new, för då är ju inte datagriden initierad i aspx sidan. Om det är tvärtom så borde det fungera utan att deklarera mlist som new i klassen. Eller tänker jag fel?
I alla exempel som jag har sett på nätet har man aldrig deklarerat webform kontrollen som new i codebehind klassen. Dock har jag aldrig fått det att fungera.Sv: CodeBehind
Den enda klass som instansieras är aspx-klassen. Codebehind och ui.page klasserna är en del av aspx-klassen.
Sätt brytpunkter och starta i debug så kan du stega genom alla händelser och se vilka objekt som finns.
/TommySv: CodeBehind
mList finns inte med på vbsidan som man inte deklarerar den som new.
men deklarerar man den som new så syns inget data i griden.
och jag har sökt igenom msdn..Sv: CodeBehind
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbconWebFormsPageProcessingStages.asp