T trexter Medlem sedan mars 2002 1 889 inlägg Frågan 21 dec. 2005 21:28 #1 Jag har denna funktionen och vill alltså lägga till data från databasen till två dropdown-listor. Den ena ligger utanför en datagrid (och här fungerar det). Den andra ligger inuti. Hur ska jag göra för att "asp:n" ska hitta kontrollen?
<EditItemTemplate>
<asp:DropDownList ID="edit_droptillverkare" runat="server"></asp:DropDownList>
</EditItemTemplate>
public void PopulateDrops()
{
myConnection.Open();
SqlCommand myCommand = new SqlCommand("select TillverkareID, TillverkareNamn from Tillverkare where TillverkareAnvID = @TillverkareAnvID", myConnection);
myCommand.Parameters.Add("@TillverkareAnvID", SqlDbType.Int, 10).Value = UserIdentityName[1];
SqlDataReader dr = myCommand.ExecuteReader();
if (dr.HasRows) {
droptillverkare.DataSource = dr;
droptillverkare.DataTextField = "TillverkareNamn";
droptillverkare.DataValueField = "TillverkareID";
droptillverkare.DataBind();
[b]edit_droptillverkare.DataSource = dr;
edit_droptillverkare.DataTextField = "TillverkareNamn";
edit_droptillverkare.DataValueField = "TillverkareID";
edit_droptillverkare.DataBind(); [/b]
}
dr.Close();
}
:)
C Croolie Medlem sedan dec. 2004 35 inlägg Det du måste göra är att själv ange vilka columns du vill visa i datagriden. Där du måste själv ange att det skall visas en dropdownlist. Det gör du enligt följande:
<asp:datagrid>
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<asp:DropDownList>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:datagrid>
Sedan måste du ange DataSource till dropdownlist
DataSource="<%# fillDropDown() %>
där du tex har en metod som returnerar ett dataset med den data du hämtat ifrån databasen... Hoppas du förstod detta :)
T trexter Medlem sedan mars 2002 1 889 inlägg Jag ser ingen principiell skillnad mellan sättet du gjort på och så jag gjorde?! :q
edit. Eller jo, det gör jag visst då. Om man gör ändringen i .aspx-filen... ;)
Jag förstår hur du menar men hur ska jag göra för att skicka med dels värden till dropdownen & även id-nummer som skalla "indexera" värdena?
:)
T trexter Medlem sedan mars 2002 1 889 inlägg D DavidB Medlem sedan jan. 2000 1 372 inlägg Har inte testat koden själv men det borde fungera.
<asp:datagrid onitemdatabound="itemDataBound" runat="server">
<asp:templatecolumn>
<itemtemplate>
<asp:dropdownlist id="dd" runat="server" />
</itemtemplate>
</asp:templatecolumn>
</asp:datagrid>
private void itemDataBound(object sender, DataGridItemEventArgs e){
DropDownList ddl;
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem){
ddl = (DropDownList)e.Item.Cells[0].FindControl("dd");
// Här lägger du kod för att fylla DropDownListen
// eller vad det är du vill göra med den
}
}
T trexter Medlem sedan mars 2002 1 889 inlägg DavidB, bestämde mig för att försöka använda din lösning men får inte riktigt rätt på det. :)
public void itemDataBound(object sender, DataGridItemEventArgs e)
{
DropDownList dd1;
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
dd1 = (DropDownList)e.Item.Cells[0].FindControl("edit_droptillverkare");
[b]dd1.DataSource = DropsData();[/b]
dd1.DataTextField = "DText";
dd1.DataValueField = "DValue";
dd1.DataBind();
dd1.SelectedIndex = 0;
}
}
" Exception Details: System.NullReferenceException: Object reference not set to an instance of an object."
DropsData() returnerar en DataView (denna funktion fungerar eftersom den används vid ett annat tillfälle också).
ICollection DropsData()
{
...
DataView dv = new DataView(dt);
return dv;
}
D DavidB Medlem sedan jan. 2000 1 372 inlägg Har du fler kolumner i DataGriden?
T trexter Medlem sedan mars 2002 1 889 inlägg <ASP:DataGrid id="MyDataGrid" runat="server"
Width="700"
BackColor="#ccccff"
BorderColor="black"
ShowFooter="false"
CellPadding=3
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
OnEditCommand="MyDataGrid_Edit"
OnCancelCommand="MyDataGrid_Cancel"
OnUpdateCommand="MyDataGrid_Update"
OnDeleteCommand="MyDataGrid_Delete"
DataKeyField="ProduktID"
AutoGenerateColumns="false"
OnItemDataBound="itemDataBound" >
<Columns>
<asp:ButtonColumn Text="Ta bort" CommandName="Delete"/>
<ASP:EditCommandColumn EditText="Editera" CancelText="Avbryt" UpdateText="Uppdatera" HeaderStyle-Wrap=false />
<ASP:BoundColumn HeaderText="ID" DataField="ProduktID" ReadOnly=true />
<ASP:TemplateColumn HeaderText="Namn" SortExpression="ID">
<ItemTemplate>
<asp:Label runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "ProduktNamn") %>'/>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" id="edit_namn" Text='<%# DataBinder.Eval(Container.DataItem, "ProduktNamn") %>'/>
</EditItemTemplate>
</asp:TemplateColumn>
<ASP:TemplateColumn HeaderText="Tillverkare" SortExpression="IDd">
<ItemTemplate>
<asp:Label runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "TillverkareNamn") %>'/>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="edit_droptillverkare" runat="server"></asp:DropDownList>
</EditItemTemplate>
</asp:TemplateColumn>
</Columns>
</ASP:DataGrid>
D DavidB Medlem sedan jan. 2000 1 372 inlägg Felet beror på att den inte hittar någon dropdownlist i den angivna kolumnen.
Du måste ange vilken kolumn från vänster med början på 0 det gällen, i ditt fall 4.
(DropDownList)e.Item.Cells[[b]4[/b]].FindControl("edit
Fast nu när du har ItemTemplates och EditItemTemplates blev jag lite osäker. Du borde få lägga in en if-sats som kollar att du kör "Edit".
Skulle kunna tänka mig att det kan se ut nåt liknande detta:
public void itemDataBound(object sender, DataGridItemEventArgs e){
if(e.Item.ItemIndex == MyDataGrid.EditItemIndex){
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem){
DropDownList dd1 = (DropDownList)e.Item.Cells[4].FindControl("edit_droptillverkare");
dd1.DataSource = DropsData();
dd1.DataTextField = "DText";
dd1.DataValueField = "DValue";
dd1.DataBind();
dd1.SelectedIndex = 0;
}
}
}
T trexter Medlem sedan mars 2002 1 889 inlägg Utan den extra if-satsen - samma felmeddelande som innan.
Med if-satsen - ingen data läggs till i dropdown-lsitan,.
:)
T trexter Medlem sedan mars 2002 1 889 inlägg Jag får alltså
"Exception Details: System.NullReferenceException: Object reference not set to an instance of an object."
Något som kan vara fel i
dd1 = (DropDownList)e.Item.Cells[4].FindControl("edit_droptillverkare");
?
edit_droptillverkare är namnet på dropdwon:en. Testade att ge namnet på DataGrid:en också (kan inte denna syntaxen) men det fungerade inte heller...
Hjälp!! :e
D DavidB Medlem sedan jan. 2000 1 372 inlägg Jag har suttit och testat lite och får samma fel också, lite konstigt för det känns rätt :)
Fast en annan lösning kanske är att du skapar DropDownListen i din CodeBehind?
public void itemDataBound(object sender, DataGridItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
DataTable dt = new DataTable();
// ...
DropDownList ddl = new DropDownList();
ddl.DataSource = dt;
ddl.DataBind();
e.Item.Cells[4].Controls.Add(ddl);
}
}
T trexter Medlem sedan mars 2002 1 889 inlägg Det fungerar inte heller. Man ska inte köra det hela i en annan metod då, typ MyDataGrid_Edit?