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 ?
5 svar · 394 visningar · startad av CokeLight
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...?
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 ?
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..?
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
hej.. aha.. ok, det var bra vägledning..! ska testa.. (höll på med annat o såg inte att det kommit svar)..
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..! :)