webForumDet fria alternativet

dropdownlista i varje item i en dataview

.NET

4 svar · 408 visningar · startad av inspiro

Medlem sedan sep. 2005673 inlägg
Frågan#1

Hej! Har en dataview där varje rad innehåller en dropdownlista som ska fyllas med samma värden för varje rad (dock kan innehållet variera mellan olika personer/dagar).Nu gör jag ett db-anrop för varje item när jag binder min dataview, men eftersom innehållet på varje rad ska vara samma så känns det ju himla onödigt. Skulle vilja göra ett enda db-anrop och sedan återanvända det i alla rader, men hur gör man det?

Medlem sedan jan. 20022 440 inlägg
#2

Jag förstår vad du menar, var tvungen att lösa det i ett tidigare projekt. Jag postar lösningen direkt konverterad till C# men jag är inte säker på att det är bästa sättet. Vill bara visa hur man kan göra för att återanvända ett datatable på hela sidan.

public DataView myOrderDetailsView;
public DataTable OrderRows { 
    get { 
        DataTable tmpOrderRows; 
        int i; 
        DataRow dr; 
        
        if (Session("MyOrderRows") == null) { 
            tmpOrderRows = new DataTable(); 
            
            // first load -- prepopulate with some data 
            // if this is a new order then populate with blank records 
            if ((Request.QueryString("Orderid") == "NewOrder") | (NewOrderRequested) | (Request.QueryString("Orderid") == "")) { 
                tmpOrderRows.Columns.Add(new DataColumn("Qty", typeof(string))); 
                tmpOrderRows.Columns.Add(new DataColumn("Description", typeof(string))); 
                tmpOrderRows.Columns.Add(new DataColumn("GLCodeID", typeof(string))); 
                tmpOrderRows.Columns.Add(new DataColumn("UnitPrice", typeof(double))); 
                tmpOrderRows.Columns.Add(new DataColumn("Taxid", typeof(string))); 
                tmpOrderRows.Columns.Add(new DataColumn("TotalPrice", typeof(double))); 
                tmpOrderRows.Columns.Add(new DataColumn("OrderID", typeof(string))); 
                tmpOrderRows.Columns.Add(new DataColumn("OrderDetailID", typeof(string))); 
                
                // Add 5 blank lines 
                for (i = 1; i <= 5; i++) { 
                    dr = tmpOrderRows.NewRow(); 
                    tmpOrderRows.Rows.Add(dr); 
                } 
            } 
            
            else { 
                // this is an existing order 
                tmpOrderRows = myUtils.dbDataView("SELECT OrderDetailID, OrderID, Qty, Description, GLCodeID, Price As UnitPrice, (Price * Qty) AS TotalPrice, Taxid FROM tblOrderDetails where ORderid=" + Request.QueryString("orderid")).Table; 
                dr = tmpOrderRows.NewRow(); 
                tmpOrderRows.Rows.Add(dr); 
                dr = tmpOrderRows.NewRow(); 
                tmpOrderRows.Rows.Add(dr); 
            } 
            // Save either table to the Session Variable 
            Session("MyOrderRows") = tmpOrderRows; 
            return tmpOrderRows; 
        } 
        else { 
            return Session("MyOrderRows"); 
        } 
    } 
}
Medlem sedan jan. 20022 440 inlägg
#3

Ja just det så för att binda till din ddl så anropar du ju bara (i mitt fall)

myOrderDetailsView = OrderRows.DefaultView;
Medlem sedan sep. 2005673 inlägg
#4

Tack för tipset! Jag har gjort samma nu men använder viewstate istälelt för sessions, inbillar mig att det är lite mer resurssnålt:

if (ViewState["PeriodNames"] == null)
{
  Database db = new Database();
  ViewState["PassNames"] = db.GetDataTable("GetPassNames");
}

DropDownList PassDDL = ((DropDownList)e.Item.FindControl("PassDDL"));
PassDDL.DataSource = ViewState["PassNames"];

Kommentera gärna koden om jag gör nåt knas. :)

Medlem sedan jan. 20022 440 inlägg
#5

Det är ungefär samma sak fast jag tar för givet att det är bättre att använda viewstate. Anledningen till att jag använde sessions var att jag behövde spara det mellan flera olika sidor och inte hade en aning om hur viewstate funkade när jag skapade koden ;)

286 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
154 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
118 ms — ändringar (db)