DropDownList in GridView   otázka

C#, ASP.NET WebForms, HTTP/HTML

Nazdárek.

Při psaní jedné aplikace jsem se dostal do situace, kdy mám DropDownList vnořen do dvou v sobě vnořených GridView viz:

<script type="text/javascript">

    function ChildBlock(img, obj) {
        if (obj.style.display == 'none') {
            obj.style.display = '';
            img.src = "<%=MB.BSystem.Common.Utils.CommonHelper.GetStoreLocation()%>images/collapse.png";
        }
        else {
            obj.style.display = 'none';
            img.src = "<%=MB.BSystem.Common.Utils.CommonHelper.GetStoreLocation()%>images/expand.png";
        }
    }
</script>

<asp:GridView ID="gvProgramStatus" runat="server" AutoGenerateColumns="False" Width="100%"
    OnPageIndexChanging="gvProgramStatus_PageIndexChanging" AllowPaging="true" 
    PageSize="50" onrowdatabound="gvProgramStatus_RowDataBound">
    <Columns>
        <asp:TemplateField HeaderText="Název" ItemStyle-Width="10%">
            <ItemTemplate>
                <%#Server.HtmlEncode(Eval("Title").ToString())%>
            </ItemTemplate>

<ItemStyle Width="10%"></ItemStyle>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Lisy k programu" HeaderStyle-HorizontalAlign="Center"
            ItemStyle-Width="60%" ItemStyle-HorizontalAlign="Center">
            <ItemTemplate>
                <asp:Panel runat="server" ID="pnlVariants" Style="text-align: left">
                    <img src='<%#Page.ResolveUrl("~/images/expand.png") %>' alt="variants" onclick="ChildBlock(this,document.getElementById('pvGrid<%#Eval("ProgramStatusID") %>'));" />
                    <div id='pvGrid<%#Eval("ProgramStatusID") %>' style="display: none">
                        <asp:GridView runat="server" ID="gvLisyForProgramStatus" DataKeyNames="LisID"
                            AutoGenerateColumns="false" Width="100%" 
                        onrowdatabound="gvLisyForProgramStatus_RowDataBound">
                            <Columns>
                                <asp:TemplateField HeaderText="Název" ItemStyle-Width="10%">
                                    <ItemTemplate>
                                        <%#Server.HtmlEncode(Eval("LisName").ToString())%>
                                    </ItemTemplate>
                                    <ItemStyle Width="10%" />
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="LisID" Visible="false" ItemStyle-Width="0%">
                                    <ItemTemplate>
                                        <%#Server.HtmlEncode(Eval("LisID").ToString())%>
                                    </ItemTemplate>
                                    <ItemStyle Width="0%" />
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Popis" ItemStyle-Width="65%">
                                    <ItemTemplate>
                                        <%#Eval("Pozn").ToString()%>
                                    </ItemTemplate>
                                    <ItemStyle Width="65%" />
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Přiřazení(dodělat)" ItemStyle-Width="65%">
                                    <ItemTemplate>
                                        <asp:DropDownList ID="ddlProgramStatus" runat="server"  
                                            onselectedindexchanged="ddlProgramStatus_SelectedIndexChanged"
                                            AutoPostBack="true">
                                        </asp:DropDownList>
                                       
                                    </ItemTemplate>
                                    <ItemStyle Width="65%" />
                                </asp:TemplateField>


                            </Columns>
                        </asp:GridView>
                    </div>
                </asp:Panel>
            </ItemTemplate>

<HeaderStyle HorizontalAlign="Center"></HeaderStyle>

<ItemStyle HorizontalAlign="Center" Width="60%"></ItemStyle>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Smazáno" HeaderStyle-HorizontalAlign="Center" ItemStyle-Width="5%"
            ItemStyle-HorizontalAlign="Center">
            <ItemTemplate>
                <BSys:ImageCheckBox runat="server" ID="cbDeleted" Checked='<%# Eval("Deleted") %>'>
                </BSys:ImageCheckBox>
            </ItemTemplate>

<HeaderStyle HorizontalAlign="Center"></HeaderStyle>

<ItemStyle HorizontalAlign="Center" Width="5%"></ItemStyle>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Program" HeaderStyle-HorizontalAlign="Center"
                ItemStyle-Width="10%" ItemStyle-HorizontalAlign="Center">
                <ItemTemplate>
                    <a href="ProgramStatusDetails.aspx?ProgramStatusId=<%#Eval("ProgramStatusID")%>" title="Download">
                        Download
                    </a>
                </ItemTemplate>

<HeaderStyle HorizontalAlign="Center"></HeaderStyle>

<ItemStyle HorizontalAlign="Center" Width="10%"></ItemStyle>
            </asp:TemplateField>
        <asp:TemplateField HeaderText="Editovat" HeaderStyle-HorizontalAlign="Center"
                ItemStyle-Width="10%" ItemStyle-HorizontalAlign="Center">
                <ItemTemplate>
                    <a href="ProgramStatusDetails.aspx?ProgramStatusId=<%#Eval("ProgramStatusID")%>" title="Edit">
                        Edit
                    </a>
                </ItemTemplate>

<HeaderStyle HorizontalAlign="Center"></HeaderStyle>

<ItemStyle HorizontalAlign="Center" Width="10%"></ItemStyle>
            </asp:TemplateField>
    </Columns>
    <PagerSettings PageButtonCount="50" Position="TopAndBottom" />
</asp:GridView>

Všechno se mi podařilo nabindovat správně, až na odchytávání SelectedIndexChanged u ddlProgramStatus. Přikládám kód:

namespace MB.BSystem.Admin.Modules
{
    public partial class Admin_Modules_ProgramStatus : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                BindData();
                if (!BaseBusinessLogic.IsApproved("MB.BSystem.AdminAcces.Programators"))
                {
                    gvProgramStatus.Columns[4].Visible = false;
                    btnAddNew.Visible = false;
                }
                
            }
        }

        private void BindData()
        {
            var programStatusCollection = ProgramStatusService.GetAllProgramStatus(BaseBusinessLogic.IsApproved("MB.BSystem.AdminAcces.Admin"));
            gvProgramStatus.DataSource = programStatusCollection;
            gvProgramStatus.DataBind();
        }
        protected void gvProgramStatus_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvProgramStatus.PageIndex = e.NewPageIndex;
            BindData();
        }
        protected void gvProgramStatus_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                gsch_ProgramStatus programStatus = (gsch_ProgramStatus)e.Row.DataItem;

                Panel pnlVariants = e.Row.FindControl("pnlVariants") as Panel;
                if (pnlVariants != null)
                {
                    var lisyProProgram = programStatus.gsch_SeznamLisus;
                    if (lisyProProgram.Count == 0)
                    {
                        pnlVariants.Visible = false;
                    }
                    else
                    {
                        GridView gvLisyForProgramStatus = e.Row.FindControl("gvLisyForProgramStatus") as GridView;
                        if (gvLisyForProgramStatus != null)
                        {
                            gvLisyForProgramStatus.DataSource = lisyProProgram.Where(d=>d.Deleted == false).OrderBy(s=>s.LisName);
                            gvLisyForProgramStatus.DataBind();
                        }
                    }
                }
            }

        }
        protected void gvLisyForProgramStatus_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                gsch_SeznamLisu seznamLisu = (gsch_SeznamLisu)e.Row.DataItem;
                DropDownList ddlProgramStatus = e.Row.FindControl("ddlProgramStatus") as DropDownList;

                var programStatus = ProgramStatusService.GetAllProgramStatus(BaseBusinessLogic.IsApproved("MB.BSystem.AdminAcces.Admin"));

                if (ddlProgramStatus != null)
                {
                    foreach (var i in programStatus)
                    {
                        ListItem item = new ListItem(i.Title, i.ProgramStatusID.ToString());
                        ddlProgramStatus.Items.Add(item);
                    }
                    ddlProgramStatus.SelectedValue = seznamLisu.ProgramStatusID.ToString();

                }
            }

        }
        protected void ddlProgramStatus_SelectedIndexChanged(object sender, EventArgs e)
        {
            DropDownList ddlProgramStatus = sender as DropDownList;
            GridView gvLisyForProgramStatus = gvProgramStatus.Rows[2].Cells[0].FindControl("gvLisyForProgramStatus") as GridView;
            DropDownList ddl = (DropDownList)sender;
            GridViewRow row = (GridViewRow)ddl.NamingContainer;
            int myValue = (int)gvLisyForProgramStatus.DataKeys[row.DataItemIndex].Value;


            if (LisyazarizeniService.UpdateProgramStatus(int.Parse(ddlProgramStatus.SelectedValue), myValue))
            {
                BindData();
            }


        }

    }
}

Celý problém je v tom, že jakmile nastane PostBack na ddlProgramStatus chtěl bych odchytit správnou tabulku a DropDownList, na kterém tato změna nastala. Odchycení DDL pomocí senderu není problém, ale jelikož jsou vygenerované tabulky v různém počtu, nevím, jak zacílovat na správnou tabulku. Nemá někdo zkušenosti s podobným problémem ? Mělo by stačit:

GridView gvLisyForProgramStatus = gvProgramStatus.Rows[???].FindControl("gvLisyForProgramStatus") as GridView;

odchytit číslo řádku nadřazeného GridView a toto číslo nastavit místo otazníků, ale ať zkouším cokoliv, nemůžu na to přijít.

Předem moc děkuji za jakoukoliv 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