Dynamické generování obsahu filtru pro GridView   zodpovězená otázka

C#, ASP.NET WebForms, Komponenty

Zdravím,

mám tento problém. Potřebuji filtrovat zýznamy v GridView pomocí několika DropDovnlistů. Problém mám s jejich naplnění při pužití některého z filtrů. Chci aby obsahovali jen relevatní informace k daným záznamům v GridView. Dropdownlisty plním pomocí SqlDataSource a to něčím takovým

FROM TabIZasilka
 WHERE
(TabIZasilka.TypZasilky = 'S')  AND (TabIZasilka.CisZasilky > 100000) AND (TabIZasilka.Lod IS NOT null)
AND (TabIZasilka.Lod LIKE @lod) AND ( TabIZasilka.CisZasilky =  CASE
    WHEN @cislozasilky =-1 THEN TabIZasilka.CisZasilky
    ELSE @cislozasilky
    END) 
ORDER BY 1 DESC

O zněmu položek Dropdownlistů dělám tímto kódem:

 /// sekce generovaní dropdownlistu
        string i, j;

        //TextBox2.Text = SqlDataSource2.SelectCommand.ToString();

        i = DropDownList1.SelectedValue.ToString();
        j = DropDownList2.SelectedValue.ToString();
        TextBox2.Text += DropDownList1.SelectedValue.ToString() + "\r\n";
        TextBox2.Text += DropDownList2.SelectedValue.ToString() + "\r\n";

        DropDownList1.Items.Clear();
        DropDownList1.DataSourceID = SqlDataSource2.ID;
        DropDownList1.DataBind();
        DropDownList1.Items.Insert(0, new ListItem("Všechny", "%"));
        //DropDownList1.SelectedValue = i;
        //for (int k = 0; k < DropDownList1.Items.Count; k++) TextBox2.Text += DropDownList1.Items[k].ToString() + " ";
        //TextBox2.Text += "\r\n ";

        DropDownList2.Items.Clear();
        DropDownList2.DataSourceID = SqlDataSource3.ID;
        DropDownList2.DataBind();
        DropDownList2.Items.Insert(0, new ListItem("Všechny", "-1"));
        //DropDownList2.SelectedValue = j;
        //for (int k = 0; k < DropDownList2.Items.Count; k++) TextBox2.Text += DropDownList2.Items[k].ToString() + " ";
        //TextBox2.Text += "\r\n ";

Kód je umístněný v metodě OnPageLoad.

Problém je s vygenerování nových položek DropdownListu.

Díky za rady.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ale fuj, to je teda kód.

Pokud chcete, aby v DropDownListech bylo jen hodnoty, které se v GridView vyskytují v určitém sloupci, nemá smysl ty DropDownListy plnit z databáze.

V GridView_DataBound projděte buňky daného sloupce ve všech řádcích a hodnoty do DropDownListů nagenerujte.

Píšu z hlavy, takže v tom určitě budou chyby:

protected void GridView1_DataBound(object sender, EventArgs e)
{
    FillDropDownListFromGrid("Category", "CategoryId", GridView1, DropDownList1);
}

public static void FillDropDownListFromGrid(string nameField, string valueField, GridView grid, DropDownList dropDown)
{
    // projít všechny řádky
    dropDown.Items.Clear();
    foreach (GridViewRow row in grid.Rows)
    {
        // jen datové řádky (kašleme na hlavičky, zápatí, pager apod.)
        if (row.RowType == RowType.DataRow)
        {
            // pokud tam položka ještě není, přidat
            var value = ((DataRowView)row.DataItem)[valueField];
            var name = ((DataRowView)row.DataItem)[nameField];
            if (dropDown.Items.FindByValue(value) == null)
            {
                dropDown.Items.Add(new ListItem(name, value));
            }
        }
    }
}

Parametr valueField je název sloupce, který obsahuje IDčko, nameField název sloupce, který obsahuje text, který se zobrazí (můžou být klidně stejné, pokud nemáte IDčko).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky moc. Toto jsem přesně potřeboval.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mám ještě problém s tímto přetypováním. obě proměné mám jako string ale přetypování na DataRowView nwfunguje jak ma.

            var value = ((DataRowView)row.DataItem)[valueField];
            var name = ((DataRowView)row.DataItem)[nameField];

Díky za radu

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback