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.
|