webForumDet fria alternativet

SelectedIndex på DropDownList när den ligger i GridView?

.NET

5 svar · 394 visningar · startad av CokeLight

Medlem sedan juni 2000504 inlägg
Frågan#1

Hej,

Jag vill visa data från databas i en gridview. Databasen ser ut så här:

tblItem:
ID int
col2 int
col3 varchar(100)
Language_fkID int
col4 varchar(80)

tblLanguage:
pkID int
ItemLanguage varchar(50)

Så Language ligger alltså i en separat tabell. I GridView:n vill jag att Language ska visas i en DropDownList så här:

<asp:GridView ID="grdItems" runat="server" AutoGenerateColumns="False" AutoGenerateEditButton="true".............>
    <Columns>
        <asp:BoundField DataField=............../>
        <asp:BoundField DataField=............../>
        <asp:BoundField DataField=............../>
        
        <asp:TemplateField HeaderText="Language">
            
            <ItemTemplate>
                <%#Eval("ItemLanguage") %>
            </ItemTemplate>
            
            <EditItemTemplate>                
                <asp:DropDownList runat="server" ID="ddlLanguage" DataSource="<%#GetLanguages()%>" DataTextField="LangName" DataValueField="LangID"/>
            </EditItemTemplate>
            
        </asp:TemplateField>
        
        <asp:BoundField DataField=............../>
    </Columns>
</asp:GridView>

Det fungerar så när som på att jag inte vet hur jag ska sätta SelectedIndex på "ddlLanguage"? Alltså att om det står Franska för just den posten så vill i databasen så vill jag att Franska ska vara vald i DropDownList:n.. :) Jag har provat lite med OnRowEditing, OnDataBound och köra FindControl("ddlLanguage") o sätta ddlLanguage på det sättet men min kod fungerar inte så jag undrar om det är nån som vet hur man gör detta...?

Medlem sedan dec. 19996 522 inlägg
#2

Hitta kontrollen i ondatabound på din grid ge dem tmpnamnet ddlLanguage, sen något i stil med

ddlLanguage.Items.FindByValue(languageId.ToString()).Selected = true;

Hittar du kontrollen ?

Medlem sedan juni 2000504 inlägg
#3

Hej Erka, tack för ditt svar. Min OnDataBound ser ut så här:

protected void grdItems_OnDataBound(object sender, EventArgs e)
{
    DropDownList ddlTemp = (DropDownList)grdItems.FindControl("ddlLanguage");
    ddlTemp.Items.FindByValue("LangID").Selected = true;
}

Men jag får det gamla "Object reference not set to an instance of an object" :) (det var det felet jag fick hela tiden när jag testade..) Vet inte riktigt vad jag gör för fel..? Vet du vad det kan vara..?

/edit: Är det så att FindControl inte letar efter kontroller som ligger i <EditItemTemplate> eller..?

Medlem sedan dec. 19996 522 inlägg
#4

ddlTemp.Items.FindByValue("LangID").Selected = true, säger ju att du ska hämta det värdet i dropdownlisten där värdet är LangId och inte det tyska LangId:t. Du får hämta ut din datarow ur e.Item.DataItem och där kanske du har ditt langId för den aktuella raden, beror på hur vad du har bundit. Sen måste du gå på e.Item.FindControl() och inte själva griden

Medlem sedan juni 2000504 inlägg
#5

hej.. aha.. ok, det var bra vägledning..! ska testa.. (höll på med annat o såg inte att det kommit svar)..

Medlem sedan juni 2000504 inlägg
#6

hej, tänkte jag kunde posta hur det blev (till slut).. var lite knepigt med syntaxen o en del andra grejer.. visste inte att jag var tvungen att casta till DataRowView först t.ex.... Detta funkade för mig i alla fall:

protected void grdItem_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    DropDownList ddlTemp = null;
    string curLang = string.Empty;
    
    //DataRow check ensures that you don't get the header/footer (or any other irrelevant) row.
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        ddlTemp = (DropDownList)e.Row.FindControl("ddlLanguage");

        if (ddlTemp != null)
        {
            curLang = ((DataRowView)e.Row.DataItem)["ItemLanguage"].ToString();
            ddlTemp.Items.FindByText(curLang).Selected = true;
        }
    }              
}

i princip som Erka sa, med några små extra detaljer.. så tack för vägledningen..! :)

258 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)