Hej! Jag sitter och försöker koda ihop en funktion där man kan ladda upp bilder till både server och databas med asp. Jag kan ladda upp bilderna. så funktionen fungerar. Problemet är när jag vill lägga funktionen i ett FormView. Funktionen fungerar bra utanför, men nu vill jag ha den i ett FormView. Jag får felet: "Object reference not set to an instance of an object." Du har deklarerat en variabel av typen Button som heter cmdSend utan att instansiera den med keywordet new vilket gör att den i runtime kommer att vara null och därför får du felet. Tusen tack för ditt svar Robin! Tror jag är med på vad du menar. Jag har nu tagit bort cmdSend från CodeBehind filen. (Har tagit bort raden "protected System.Web.UI.WebControls.Button cmdSend; " och "this.cmdSend.Click += new System.EventHandler(this.cmdSend_Click);") Hej, Hjälp - Object reference not set to an instance of an object.
Koden ser ut så här:
aspx;
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server" enctype="multipart/form-data">
<asp:FormView ID="FormView1" DefaultMode="Insert" runat="server" enctype="multipart/form-data" DataKeyNames="ID"
DataSourceID="AccessDataSource1" Height="115px" Width="462px">
<InsertItemTemplate>
<asp:label id="lblFile" runat="server" Font-Bold="True">Picture:</asp:label>
<input id="filMyFile" type="file" runat="server">
<p></p>
<asp:button id="cmdSend" runat="server" Text="Send"/>
<p></p>
<asp:Label id="lblInfo" runat="server" Font-Bold="True" Visible="false"></asp:Label>
<p></p>
Rubrik:
<asp:TextBox ID="RubrikTextBox" runat="server" Height="20px"
Text='<%# Bind("Rubrik") %>' Width="330px" />
<br />
<asp:DropDownList ID="DropDownList1" runat="server"
DataSourceID="AccessDataSource2" DataTextField="kategori_namn"
DataValueField="ID" SelectedValue='<%# Bind("kategori_namn") %>'>
</asp:DropDownList>
<asp:AccessDataSource ID="AccessDataSource2" runat="server"
DataFile="~/Databas1.accdb" SelectCommand="SELECT * FROM [kategorier]">
</asp:AccessDataSource>
<br />
Text:
<asp:TextBox ID="content_textTextBox" runat="server" Height="150px"
Text='<%# Bind("content_text") %>' Width="328px" TextMode="MultiLine" />
<br />
Bild:
<asp:TextBox ID="content_bildTextBox" runat="server" Height="20px"
Text='<%# Bind("content_bild") %>' Width="330px" />
<br />
<asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True"
CommandName="Insert" Text="Lägg till" />
<asp:LinkButton ID="InsertCancelButton" runat="server"
CausesValidation="False" CommandName="Cancel" Text="Avbryt" />
</InsertItemTemplate>
...........
aspx.cs;
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Data;
using System.Data.OleDb;
namespace FileUpload
{
public class WebForm1 : System.Web.UI.Page
{
private const string MDBFILE = "~/Databas1.mdb";
protected Label lblFile;
protected HtmlInputFile filMyFile;
protected System.Web.UI.WebControls.Label lblInfo;
protected System.Web.UI.WebControls.Button cmdSend;
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
this.cmdSend.Click += new System.EventHandler(this.cmdSend_Click);
}
private void Page_Load(object sender, System.EventArgs e)
{
if( Request.QueryString["FileID"] != null )
{
ShowTheFile(Convert.ToInt32(Request.QueryString["FileID"]));
}
}
.......
Koden fortsätter men det är här jag får problemen. Raden jag får felmeddelande för är "Line 33: this.cmdSend.Click += new System.EventHandler(this.cmdSend_Click);"
Någon snälla hjälp mig, blir galen då jag försökt i flera timmar att lösa detta genom att googla.
Ska också läggas till att jag är ganska ny i området...
//AndersSv: Hjälp - Object reference not set to an instance of an object.
Vad jag kan se av din kod är att du vill lyssna på Click-eventet för den knapp du har i apsx-filen som också heter cmdSend. Det borde räcka med att du tar bort deklarationen av cmdSend i CodeBehind filen för att du ska komma åt rätt knapp.
För att förtydliga mig: Det du har gjort nu är egentligen att skapa 2st knappar med namnet cmdSend och när du i CodeBehind försöker lyssna på eventet Click så gör du det på den knapp du har deklarerat i CodeBehind och inte i aspx-filen.
Hoppas du förstår vad jag menar.Sv:Hjälp - Object reference not set to an instance of an object.
Jag antog att dessa var onödiga efter att tolkat ditt svar. Nu fungerar det att lägga i mitt FormView. Saken nu är den att bilderna inte laddas upp. Kanske är enkelt åtgärdat men jag är lite snurrig just nu.
Koden för knappklicket ser ut så här:
private void cmdSend_Click(object sender, System.EventArgs e)
{
// Check to see if file was uploaded
if( filMyFile.PostedFile != null )
{
// Get a reference to PostedFile object
HttpPostedFile myFile = filMyFile.PostedFile;
// Get size of uploaded file
int nFileLen = myFile.ContentLength;
// make sure the size of the file is > 0
if( nFileLen > 0 )
{
// Allocate a buffer for reading of the file
byte[] myData = new byte[nFileLen];
// Read uploaded file from the Stream
myFile.InputStream.Read(myData, 0, nFileLen);
// Create a name for the file to store
string strFilename = Path.GetFileName(myFile.FileName);
// Write data into a file
WriteToFile(Server.MapPath(strFilename), ref myData);
// Store it in database
int nFileID = WriteToDB(strFilename, myFile.ContentType, ref myData);
// Set label's text
lblInfo.Text =
"Filename: " + strFilename + "<br>" +
"Size: " + nFileLen.ToString() + "<p>";
}
}
}
Finns det något fel i den? Tycker det är märkligt att när jag lägger funktionen utanför mitt FormView så fungerar det, alltså rakt under Form1. Men så fort jag lägger det under FormView1 så fungerar det inte.
Kanske är jag som är ute och cyklar?
//AndersSv: Hjälp - Object reference not set to an instance of an object.
Ursäkta lite sent svar :)
Din kod ser bra ut, jag har inget att anmärka på där ;) och det är inte så konstigt att den fungerar när du lägger den rakt under form-taggen och att den inte fungerar när du lägger den i FromView-taggen. Anledningen är att när du arbetar med FormView-taggen så jobbar du egentligen med ett objekt där du sätter egenskaper och där är det inte tillåtet att lägga in kod.
Personligen är jag inget stort fan av att blanda kod och markup men det är mer en smak/arkitektur-fråga.
Hoppas detta sprider lite ljus :) hör av dig om du har fler frågor!