Avatar billede badal Nybegynder
04. juli 2004 - 18:31 Der er 7 kommentarer og
1 løsning

Dropdownlist og værdi fra database

Jeg har brugt en del tid på det men har endnu ikke fundet en løsning på problemet. Inden i en datagrid har jeg <EditItemTemplate>og herinde har jeg en dropdownlist. Hvordan kan jeg sørge for at den værdi som hentes fra databasen er den valgte ? Håber i forstår spørgsmålet og der må gerne gives et kode eksempel.
Avatar billede snepnet Nybegynder
04. juli 2004 - 20:19 #1
Jeg forstår det således at den dropdownboks du har giver mulighed for at vælge mellem forskellige gyldige værdier, og at den valgte gemmes i et datagrundlag.
Ved fremvisning forventes det så at den værdi der på forhånd er valgt i dropdownboksen, er den værdi der står i datagrundlaget.... Håber det er rigtigt :o)

Nu ved jeg jo ikke rigtig hvad du gør, men hvis du binder dit datagrid til en datatable i et dataset, kan du i itemdatabind angive noget ala nedenstående :
Jeg ved ikke hvor du får valgmulighederne til dropdownboksen fra, så jeg har bare angivet dem her på simplest mulig vis - således (for eksempel - valutakoder):

private string[] currencyCodes= {"DKK","USD","GBP"};

Desuden regner jeg med at du har oprettet en templatecolumn, hvor du har givet dropdownboksen ID="ddCurrencyList"

Men... hvis du tilføjer en handler til ItemDataBound-evented, kan du skrive noget i stil med nedenstående i selve handleren :
(jeg forestiller mig i nedenstående at du har angivet en tabel i et dataset som datasource til dit grid).

private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
    // til at holde en reference til dropdownlisten
    DropDownList ddList = null;

    if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {   
        // reference til dropdownlisten
        ddList = (DropDownList)e.Item.FindControl("ddCurrencyList");
        // værdisæt til dropdownboksen
        ddList.DataSource = currencyCodes;
        // databinding
        ddList.DataBind();
        // sæt den valgte til det der står i datagriddets datasource
        ddList.SelectedIndex = ddList.Items.IndexOf(ddList.Items.FindByText(((DataRowView)e.Item.DataItem).Row["CurrencyCode"].ToString()));
    }
}

Håber du kan bruge det til noget, ellers må du lige sige til hvis jeg ikke har fanget hvad du har brug for.
Avatar billede badal Nybegynder
04. juli 2004 - 23:56 #2
Det er lige præcis det jeg forsøger at implementere, men det driller mig stadig. Her følger min kode i redigeret udgave. Jeg får fejlen "Object reference not set to an instance of an object." og det ved denne linje: ddList.DataSource = course.GetDetails;

Jeg har også forsøgt mig med "private string[] currencyCodes= {"DKK","USD","GBP"};" og "ddList.DataSource = currencyCodes;" men der får jeg samme fejl.

Bortset fra fejlene er det lige præcis jeg ønsker mig at den skal gøre.

<asp:DataGrid id="DataGrid1" runat="server" Font-Names="Verdana" GridLines="Horizontal" OnEditCommand="dgComments_EditRow"
OnUpdateCommand="dgComments_UpdateRow"
OnCancelCommand="dgComments_CancelRow"
DataKeyField="UserID"
OnItemDataBound="Item_Bound">
<Columns>
  <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Opdater" CancelText="Annuler" EditText="Rediger">
  </asp:EditCommandColumn>
  <asp:TemplateColumn>
    <EditItemTemplate>
        <asp:dropdownlist id="DropDownCondition" runat="server" Width="220">
        </asp:dropdownlist>
    </EditItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>

private void Page_Load(object sender, System.EventArgs e)
{
if (!Page.IsPostBack)
{
  ViewState["SortExpr"] = "DateCreated ASC";
  BindData("DateCreated ASC");
}
}

private void BindData(string sortExpr)
{
// Henter data fra database og binder til datagrid
......
DataGrid1.DataSource = objDataSet;
DataGrid1.DataBind();
}

public void Item_Bound(Object sender, DataGridItemEventArgs e )
{
DropDownList ddList = null;
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType ==  ListItemType.AlternatingItem)
{   
ddList = (DropDownList)e.Item.FindControl("DropDownCondition");
               
CourseDB course = new CourseDB();
               
ddList.DataSource = course.GetDetails;
ddList.DataTextField="CourseDetails";
ddList.DataValueField="Coursenumber";
               
ddList.DataBind();

ddList.SelectedIndex = ddList.Items.IndexOf(ddList.Items.FindByText(((DataRowView)e.Item.DataItem).Row["Coursenumber"].ToString()));
}
}
Avatar billede snepnet Nybegynder
05. juli 2004 - 00:23 #3
Ahh... det ser ud til at du kun har din dropdownboks i din edititemtemplate. Du skal sørge for at den også er i din itemtemplate - ellers kan du ikke få fat i den for et item ved databinding med mindre det item er i "editmode".
Avatar billede snepnet Nybegynder
05. juli 2004 - 00:31 #4
Hvis du får besværligheder med ID's på dropdownboksen kan du også bruge indexering istedet... F.eks. DropDownList ddList = (DropDownList)e.Item.Cells[X].Controls[X];
Avatar billede badal Nybegynder
05. juli 2004 - 12:55 #5
hmmm jeg har forsøgt ¨på de sidste to måder. Jeg laver en dropdownlist i itemtemplate og sætter dens visble til false, da dropdownlisten først skal vise sig når brugeren har klikket på rediger. Men jeg kan stadig ikke få fat i den dropdownliste som er i edititemtemplate.
Avatar billede snepnet Nybegynder
05. juli 2004 - 13:14 #6
ahh.... hvis det først er når der redigeres du skal vises dropdownboksen er det lidt noget andet :
Du skal udelukkende have angivet DropDownListen i din EditItemTemplate, og så skal du i ItemDataBound gøre noget som nedenstående istedet :

// til at holde en reference til dropdownlisten
DropDownList ddList = null;

if(e.Item.ItemIndex == this.DataGrid1.EditItemIndex && e.Item.ItemIndex != -1)
{   
    // reference til dropdownlisten
    ddList = (DropDownList)e.Item.FindControl("ddCurrencyList");
    // værdisæt til dropdownboksen
    ddList.DataSource = currencyCodes;
    // databinding
    ddList.DataBind();
    // sæt den valgte til det der står i datagriddets datasource
    ddList.SelectedIndex = ddList.Items.IndexOf(ddList.Items.FindByText(((DataRowView)e.Item.DataItem).Row["CurrencyCode"].ToString()));
}

Og jeg går så ud fra at du har en handler til edit-evented som er i stil med nedenstående :

private void DataGrid1_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
    this.DataGrid1.EditItemIndex = e.Item.ItemIndex;
    BindData();
}
Avatar billede badal Nybegynder
05. juli 2004 - 13:33 #7
Nu virker det perfekt :-) Snepnet .. Hvis du kan komme med et svar så vil jeg gerne point
Avatar billede snepnet Nybegynder
05. juli 2004 - 14:04 #8
Jamen det skal du få :o) - tak herfra.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester