none
datatable su repeater RRS feed

  • Domanda

  • Buongiorno, sto cercando di bindare una datarow su una datatable e quindi su un repeater, senza usare eval. La cosa risulterebbe facile, ma credo di non capire perchè la row non vada dentro la datatable. Ecco qui quello che sto facendo:

    Nel momento in cui seleziono un oggetto da inserire nella datatable, nel code behind faccio così:

    Products product = (SimulationData.LoadProducts().FirstOrDefault(p => p.Name == lbProducts.SelectedValue));
                    DataColumn[] columns = dtFavorite.Columns.Cast<DataColumn>().ToArray();
                    bool exists = dtFavorite.AsEnumerable().Any(row => columns.Any(col => row[col].ToString() == product.Name));
                    if (!exists)
                    {
                        string image = ddlCompany.SelectedItem.ToString().ToUpper();
                        image = image.Replace(" ", "");
                        product.Photo = "Images/" + image + "/" + product.Photo;
                        dtFavorite.NewRow();
                        dtFavorite.Rows.Add(new Products[] { product });
                        favoriteRepeater.DataSource = dtFavorite;
                        favoriteRepeater.DataBind();
                    }

    Controllo se esiste (probabilmente la verifica con linq è sbagliata...ma una cosa alla volta) e la inseriesco nella row, quindi nella datatable e la bindo sul repeater. Quindi nel repeater:

    protected void favoriteRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
            {
                if (e.Item.ItemType == ListItemType.Item)
                {
                    //<img src="smiley.gif" alt="Smiley face" height="42" width="42"> 
                    ((Literal)e.Item.FindControl("imageFavorite")).Text = "<img src=\"" + dtFavorite.Rows.ToString() + "//>";
                    ((Literal)e.Item.FindControl("companyFavorite")).Text = dtFavorite.Rows.ToString();
                    ((Literal)e.Item.FindControl("nameFavorite")).Text = dtFavorite.Rows.ToString();
                }
            }

    Anche qui credo sia sbagliato, ma almeno vorrei capire la prima parte: perchè la row non va dentro alla datatable e quindi al repeater. Grazie

    M.

    EDIT: Dimenticato il repeater:

    <asp:Repeater runat="server" ID="favoriteRepeater" OnItemDataBound="favoriteRepeater_ItemDataBound">
            <HeaderTemplate>
                <table width="100%">
                    <tr>
                        <th style="width:20%;text-align:left">Selection</th>
                        <th style="width:40%;text-align:left"></th>
                        <th style="width:40%;text-align:left"></th>
                    </tr>
                    <tr>
                        <td style="width:10%;text-align:left">Image</td>
                        <td style="width:45%;text-align:left">Company</td>
                        <td style="width:45%;text-align:left">Product</td>
                    </tr>
            </HeaderTemplate>
            <ItemTemplate>
                    <tr>
                        <td><asp:Literal runat="server" ID="imageFavorite"></asp:Literal></td>
                        <td><asp:Literal runat="server" ID="companyFavorite"></asp:Literal></td>
                        <td><asp:Literal runat="server" ID="nameFavorite"></asp:Literal></td>
                    </tr>
            </ItemTemplate>
            <FooterTemplate>
                </table>
            </FooterTemplate>
        </asp:Repeater>




    martedì 13 settembre 2016 10:10

Risposte

  • Buongiorno Michele,
    non puoi inserire come parametro al metodo .Add() un oggetto (nel tuo caso Products).
    I due overload del metodo Add() accettano o un oggetto di tipo DataRow o una matrice di valori che vengono utilizzati per creare la nuova riga. 

    Quindi per aggiungere il nuovo product in dtFavorite devi inserire i valori di tutte le proprietà di product in ordine di DataColumn
    Ti faccio un piccolo esempio: supponiamo che la prima DataColumn sia di tipo int e la seconda di tipo stringa, per aggiungere un nuovo DataRow fai così:

    dtFavorite.Rows.Add(product.id, product.Name);
    Ciao



    Paolo Pranzo

    • Contrassegnato come risposta Michele Boscagin martedì 13 settembre 2016 13:15
    martedì 13 settembre 2016 11:11

Tutte le risposte

  • Buongiorno Michele,
    non puoi inserire come parametro al metodo .Add() un oggetto (nel tuo caso Products).
    I due overload del metodo Add() accettano o un oggetto di tipo DataRow o una matrice di valori che vengono utilizzati per creare la nuova riga. 

    Quindi per aggiungere il nuovo product in dtFavorite devi inserire i valori di tutte le proprietà di product in ordine di DataColumn
    Ti faccio un piccolo esempio: supponiamo che la prima DataColumn sia di tipo int e la seconda di tipo stringa, per aggiungere un nuovo DataRow fai così:

    dtFavorite.Rows.Add(product.id, product.Name);
    Ciao



    Paolo Pranzo

    • Contrassegnato come risposta Michele Boscagin martedì 13 settembre 2016 13:15
    martedì 13 settembre 2016 11:11
  • Perfetto, tutto chiaro. Ti ringrazio per la precisazione

    M.

    martedì 13 settembre 2016 12:02