Hade häromdagen problem med att från koden accessa en dropdownlist som var placerad i en FormView InsertItemTemplate. Efter mycket googlande och ihoppusslande av små ledtrådar lyckades jag till slut få det att fungera. Tänk dig följande struktur i aspx-filen:
<asp:FormView ID="FormView1" runat="server" /.../ > <InsertItemTemplate> <asp:DropDownList ID="DropDownList1" runat="server"> /.../ </asp:DropDownList> </InsertItemTemplate> /.../ </asp:FormView>
Vad jag ville göra var att när det är InsertItemTemplate som visas så behövde jag kolla en grej och beroende på utfallet enabla eller disabla denna DropDownList (jag hoppar över detaljerna för att fokusera på hur jag kommer åt dropdownlistan). Först och främst kommer jag inte åt DropDownList1 direkt via koden, jag måste använda FindControl, men på vad? Rätt svar visade sig vara följande:
DropDownList DropDownList1 = (DropDownList)FormView1.Row.FindControl("DropDownList1");
Row är en referens till den datapost som just nu visas i FormView-kontrollen och det är också där kontrollerna som just nu visas finns att hitta. Men inte nog med detta, jag måste först kolla så att det är InsertItem-läget som visas;
if (FormView1.CurrentMode == FormViewMode.Insert) { DropDownList DropDownList1 = (DropDownList)FormView1.Row.FindControl("DropDownList1"); }
Men vad ska nu denna kod placeras då? Det som kändes logiskt när jag kollade i FormView-kontrollens Event-lista var ModeChanged-eventet men det funkade inte och det var då det verkliga googlandet fick ta fart. Till slut hittade jag en liten hint nånstans om att just när det gäller Insert-läget så är det PreRender-eventet som gäller. Innan dess är inte kontrollerna i InsertItem-template tillgängliga;
protected void FormView1_PreRender(object sender, EventArgs e) { if (FormView1.CurrentMode == FormViewMode.Insert) { DropDownList DropDownList1 = (DropDownList)FormView1.Row.FindControl("DropDownList1"); //Gör nåt med DropDownList1 } }
No comments :
Post a Comment