Det går inte att komma ifrån att vissa saker blir mycket krångligare att göra i ASP.NET. Är man en rutinerad ASP:are så kan det definitivt kännas väldigt krumbuktigt med en del saker, medan annat i stället blir rena drömmen. YMMV.
Addeladde skrev:
1. Jag har skapat ett dataSet och gjort några frågor som jag sedan kopplar till ett formulär med autopostback på ett gridview. Direkt uppstår en sak att om jag har en databas där jag har ett int fält för kön hur får jag ut det att det står man eller kvinna.
Det finns 49 olika sätt att lösa det på, men man kan begränsa sig till tre alternativ.
1. Plocka ut rätt format direkt från databasen. T.ex. med en CASE-sats (MSSQL) eller en IIF (Access)
SELECT CASE sex WHEN 0 THEN 'man' ELSE 'kvinna' END as sex, .....
2. Lägg en if-sats i ItemTemplate
<asp:TemplateField><ItemTemplate><%#((int)Eval("articleId"))==0 ? "man" : "kvinna"%></ItemTemplate> </asp:TemplateField>
eller gärna via en metod
<asp:TemplateField><ItemTemplate><%#GetSex((int)Eval("articleId"))%></ItemTemplate> </asp:TemplateField>
3. Ändra värdet i RowDataBound-eventet
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if (int.Parse(((DataRowView)e.Row.DataItem)["apa"].ToString()) == 1)
e.Row.Cells[0].Text = "man";
else
e.Row.Cells[0].Text += "kvinna";
}
}
Addeladde skrev:
Eller kan jag på något sätt i applikationen programmera så attvärdet från datbasen visas på ett speciellt sätt. Eller en länk hur får jag att det visas en bild istället för text.
För en länk kan du använda HyperlinkField och för en bild ImageField, och om inget funkar kan man alltid falla tillbaka på ett TemplateField, där man kan fixa allt efter behag.
Addeladde skrev:
Om jag har t.ex. ett veckoschema eller något annat som jag ska mata ut från databasen så funkar ju inte direkt en tabell med fasta rader och kulmner utan där vill man kanske använda divar med absolut positionering.
De inbyggda kontrollerna är i princip uppbyggda för att skapa tabeller. Med hjälp av en Repeater kan du dock bestämma helt vad som skapas. Det är dock inte otroligt att det blir bättre att skapa DIV:ar etc. dynamiskt, gärna genom en UserControl, så att den kan återanvändas på flera sidor.
Addeladde skrev:
Eller att man vill ha en tabell där man sammanfogar två kolumner beroende på ett värde i databasen. Hur gör man detta?
Se exemplen ovan.
Addeladde skrev:
2. Om jag vill ha ett sökformulär med typ efternamn och förnamn, stad
Och så vill jag ha en sql-sats som anpassar sig efter vad man fyllt i. I asp brukar jag skriva dynamiska sql-satser. så att frågan anpassar si efter vad man fyllt i. Kanske inte så snyggt men väldigt smidigt. Hur gör man detta i .NET?
Helst ska man köra med stored procedures, som då själv kan ta hänsyn till att ett eller flera inargument är tomma. Det går även utan SP, förresten
SELECT blablabla FROM bliblibli WHERE (@firstname='' or firstname=@firstname) AND (@lastname='' or lastname=@lastname) ....
Det kan dock finnas tillfällen då en dynamiskt skapad fråga är det bästa (även om man bör undvika det i det längsta). Ditt exempel skulle kunna skrivas...
StringBuilder sb=new StringBuilder ("Select * from users where 1 = 1");
SqlCommand cmd=new SqlCommand(conn);
if (!firstname.Equals(string.Empty))
{
cmd.Parameters.Add("@firstname",SqlDbType.VarChar,50).Value=firstName;
sb.Append(" AND firstname=@firstname");
}
if (!lastname.Equals(string.Empty))
{
cmd.Parameters.Add("@lastname",SqlDbType.VarChar,50).Value=lastname;
sb.Append(" AND lastname=@lastname");
}
cmd.CommandText=sb.ToString();
Här har jag använt StringBuilder eftersom det är ett smidigt och prestandasnålt sätt att bygga upp en sträng, bit för bit.
Använd alltid parametriserade frågor. Det är spöstraff på att inte göra det, om man har möjligheten.