webForumDet fria alternativet

Binda data till dropdown i datagrid

.NETur .NET

12 svar · 573 visningar · startad av trexter

trexterMedlem sedan mars 20021 889 inlägg
Frågan#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();
      }

:)

CroolieMedlem sedan dec. 200435 inlägg
#2

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 :)

trexterMedlem sedan mars 20021 889 inlägg
#3

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?

:)

trexterMedlem sedan mars 20021 889 inlägg
DavidBMedlem sedan jan. 20001 372 inlägg
#5

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
	}
}
trexterMedlem sedan mars 20021 889 inlägg
#6

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;
      }
DavidBMedlem sedan jan. 20001 372 inlägg
#7

Har du fler kolumner i DataGriden?

trexterMedlem sedan mars 20021 889 inlägg
#8
          <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>
DavidBMedlem sedan jan. 20001 372 inlägg
#9

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;
		}
	}
}
trexterMedlem sedan mars 20021 889 inlägg
#10

Utan den extra if-satsen - samma felmeddelande som innan.
Med if-satsen - ingen data läggs till i dropdown-lsitan,.

:)

trexterMedlem sedan mars 20021 889 inlägg
#11

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

DavidBMedlem sedan jan. 20001 372 inlägg
#12

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);
    }
}
trexterMedlem sedan mars 20021 889 inlägg
#13

Det fungerar inte heller. Man ska inte köra det hela i en annan metod då, typ MyDataGrid_Edit?

132 ms totalt · 3 externa anrop · v20260731065814-full.58439ac5
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)