renholmMedlem sedan apr. 20012 266 inlägg
piddy skrev:
självklart! =)
<%@ Import Namespace="System.Data.OleDb" %>
<%@ Import Namespace="System.Data" %>
<%@ Page Language="VB" %>
<script runat="server">
sub Page_Load(obj as Object, e as Eventargs)
'Databaskoppling
dim objForfattare as new OleDbCommand ("SELECT * FROM Forfattare)
dim objReader as OleDbDataReader
oConn.Open
objReader = objForfattare.ExecuteReader
DDLSignatur.DataSource = objReader
DDLSignatur.DataTextField = "Namn"
DDLSignatur.DataValueField = "Namn"
'prövar att ställa in ett defaultvärde
dim välj = new ListItem()
välj.Text = "Välj"
välj.Value = "#"
välj.Selected = true
DDLSignatur.Items.Add(välj)
DDLSignatur.DataBind()
end sub
</script>
....
och i html-koden:
<asp:DropDownList id="DDLSignatur" Runat="server" />
..................
det jag tror NETwork menade var att du skippar "dim bälj = new ListItem()" och i stället lägger in ett defualt val i <asp:DropDownList></asp:DropDownList>
<asp:DropDownList id="DDLSignatur" Runat="server">
<asp:ListItem Value="nada" Selected="True">Välj</asp:ListItem>
</asp:DropDownList>
NETworkMedlem sedan juni 20011 732 inlägg
menar du att jag ska lägga till "välj" i min databas?
Nepp, det ska du inte göra!!! Jag vågar inte skriva ett vb.net-exempel för då blir det säkert fel :) men du addar "Välj" i koden och sen lägger du till den data du vill ha från din db efteråt.
Eller ja, ännu enklare som i renholms exempel, men då är den ju statisk och det kan man ju vara lite allergisk emot ibland (det jag menade var väl att man inte behöver ange vilken som är selected om man lägger den högst upp och det är ju ofta högst upp man vill ha den... lite detaljpetning bara).
:)
GrynetMedlem sedan maj 2001329 inlägg Kör kodsnuttarna där du lägger till ListITem efter DDLSignatur.DataBind(). Om du inte gör detta kommer den senare databinden att binda över det listitem du lagt till.
renholmMedlem sedan apr. 20012 266 inlägg Om han lägger till den efter DataBind blir det att "Välj" hamnar längst ner vilket jag inte tycker är så snyggt, finns det något sätt att få upp det högst upp?
NETworkMedlem sedan juni 20011 732 inlägg ListItem item = new ListItem();
item.Text = "Välj";
MyDDL.Items.Insert(0,item);
Genom att använda Insert istället för Add kan du välja vilket index den ska stoppas in på... en nolla där och voila!
:)
GrynetMedlem sedan maj 2001329 inlägg Sen kommer din kod Piddy att bete sig lite konstigt eftersom hur du än gör kommer alltid Välj att vara selected. Detta eftersom du gör allting i Page_load:en. Dvs den koden som ligger i pageloaden körs varje gång man kommer in på sidan.
För att motverka detta lägger du din kod innan för en if sats (ursäkta men jag skriver i c#)
if(!Page.IsPostBack){
.
.
kod
.
.
}
Och medans vi ändå är på de basik sakerna så skall man aldrig skriva koden direkt i pageloden utan man ska lägga den i funktioner och kalla på dessa från pageloaden.
Varför frågan man sig så. Jo för hundra prosentigt kommer du någongång att vilja binda om dina grejer och då gör du fulingen att lägga till hela databas kallet på ett andra ställe = obra.
Så här nånting
private void Page_Loadd(object sender, System.Eventargs e){
if(!Page.IsPostBAck){
Bind();
}
}
private void Bind(){
//här kommer din databas kod (eller liknande)
}
private void OkB_Click(object sender, System.EventArgs e) {
Bind(); //här binder vi om allt eftersom något hänt som förändrat datan
}
Lite överkurs kanske men det är lika bra att lära sig det direkt.
}
piddyMedlem sedan aug. 200253 inlägg DDLSignatur.DataBind()
'lägger till ett defaultvärde i min DropDownListSignatur
dim item = new ListItem()
item.Text = "Välj"
item.Value = "Välj"
DDLSignatur.Items.Insert(0,item)
//detta gjorde susen!! tack snälla ni, jag är grymt imponerad av er kunskap och att ni svarar så snabbt!!
*kramas*
piddyMedlem sedan aug. 200253 inlägg ok. jag har nu stuvat om min sida i olika funktioner/subrutiner, måste bara få lite feedback på att jag fattat rätt (glöm inte bort att jag är nybörjare på ASP.NET! - men en glad och entusiastisk sådan)....
under den första Page_Load kollar jag om formuläret är skickat via metoden IsPostBack. Är formuläret inte skickat så anropar jag en fristående funktion som binder mina data.
detta gör jag i funktionen Bind().
Här sker min koppling till databasen och jag väljer att binda mina data till olika webbkontroller (än så länge bara till en Drop Down List, men det kommer att bli fler i mitt exempel).
i funktionen Submit läser jag av användaren inmatningar.
...eller?
Fråga: Var lägger jag lämpligast in ny data till min databas?
Säg att jag har en textbox där användaren exempelvis kan ange fritext som jag vill föra över till min databas. Lägger jag Insert-Queryn under funktionen Submit eller är det nu jag ska använda IsPostBack?
NETworkMedlem sedan juni 20011 732 inlägg Alldeles riktigt! På så sätt binder du bara om dina kontroller när deras data har ändrats... en stor finess med asp.net-kontroller är just att de kommer ihåg sina egna värden, därför är det väldigt onödigt att hämta data från databasen varje gång sidan laddas om. Dessutom glömmer kontrollen bort exempelvis vad som valdes innan postback och den återställs, vilket man inte alltid vill.
Ännu viktigare är att strukturen blir så mycket bättre om du tar för vana att inte ha en massa funktionalitet i din pageload. Jag vet inte hur många gånger i början man slet sitt hår över att en funktion inte fungerade, detta berodde inte sällan på att man körde nåt i pageloaden som raderade förutsättningarna för den funktion man anropade EFTER PL!
Var lägger jag lämpligast in ny data till min databas? Säg att jag har en textbox där användaren exempelvis kan ange fritext som jag vill föra över till min databas. Lägger jag Insert-Queryn under funktionen Submit eller är det nu jag ska använda IsPostBack?
Du ska inte använda ispostback, denna använder du för det mesta för att köra kod första gången sidan laddas (alltså isNOTpostback) och inte tvärtom. Gör en egen funktion som lägger till data på det sätt du vill. Sedan anropar du den funktionen i samband med en händelse, exempelvis en knapptryckning.
piddyMedlem sedan aug. 200253 inlägg dim item = new ListItem()
item.Text = "Välj"
item.Value = "0"
DDLSignatur.Items.Insert(0,item)
..jag har fyllt min drop-down list med värdet "Välj" på detta sätt, när jag vill validera kontrollen vill jag inte att värdet välj ska kunna skickas utan bara de namn som finns i Signatur...Försöker använda mig av en CustomValidator för att kolla vilket värde som är markerat och skriva ut ett felmeddelande om det är nödvändigt. Men det tycks inte fungera.
Finns det några specialregler att tänka på när värdet lagts till på detta vis?