Witam
czy jest ktos w stanie wytłumaczyć mi dlaczego nie mogę odwołać się do kontrolki DropDownList w code-behind?? Dodam że kontrola znajduje się w innej kontrolce w ListView Dopiero gdy kontrolka DropDownList znajdzie się poza kontrolką ListView mogę się do niej odwołać, w czym tkwi diabeł ? Pozdrawiam
Głowy nie dam ale być może musisz odwołać poprzez pole z listviewa
jak mógłbys podać jakis przykład był bym wdzięczny :)
DropDownList ddl = (DropDownList) this.Listview1.FindControl("DropDownList1")
Zawartość ListView
jest generowana dynamicznie, dopóki nie wstawisz do niego żadnych danych, to żaden DropDownList
w nim nie istnieje. Prawdopodobnie możesz znaleźć tą kontrolkę programowo przeszukując w mniej więcej taki sposób:
var dropDownList = this.myListView.FindControl("dropDownListId") as DropDownList;
Własnie sek w tym że ja potrzebuje wygenerowac te dane w ** DropDownList** napisałem takie o to zdarzenie które ma być za to odpowiedzialne ale wywala błąd typu: Object reference not set to an instance of an object. Dla zilustrowania problemu:
protected void ListView1_OnLoad(object sender, ListViewItemEventArgs e)
{
if (e.Item.ItemType == ListViewItemType.DataItem)
{
DropDownList dropdownlist = (DropDownList)ListView1.FindControl("DropDownList1");
string ktr, mtr;
for (int k = 0; k < 24; k++)
{
for (int m = 0; m < 60; m = m + 5)
{
if (k < 10)
{
ktr = "0" + k.ToString();
}
else
{
ktr = k.ToString();
}
if (m < 10)
{
mtr = "0" + m.ToString();
}
else
{
mtr = m.ToString();
}
dropdownlist.Items.Add(new ListItem(ktr + ":" + mtr));
}
}
}
}
Podczas Page_Load
ten DropDownList nie istnieje. Zrób to w zdarzeniu ItemDataBound
.
a więc tak MSDN poleca prosty i skuteczny sposób na sprawdzenie czy kontrolka została znaleziona. Napisałem zdarzenie dla przycisku generujące odpowiedź cos takeigo:
protected void btnSubmit_Click( object sender, EventArgs e )
{
// Find control on page.
Control myControl1 = this.ListView1.FindControl("DropDownList1");
if (myControl1 != null)
{
// Get control's parent.
Control myControl2 = myControl1.Parent;
Label5.Text = ("Parent of the text box is : " + myControl2.ID);
}
else
{
Label5.Text = ("Control not found");
}
}
jakieś inne sugestie?
Zrozum wreszcie, że tego DropDownList
nie ma w ListView
, więc nie znajdziesz go w Page_Load
ani Button_Click
. Użyj zdarzenia ItemDataBound
! W nim, w argumencie e
, będzie właściwość np. Item
i na tym poziomie trzeba szukać dynamicznie wygenerowanej kontrolki.
Właśnie staram się to zrozumieć.. jestem osobą początkującą :) więc proszę o wyrozumiałość. Kod przedstawia się następująco i wciąż nie działa
site.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
public partial class Sites_view : System.Web.UI.Page
{
protected void Item_Bound(object sender, ListViewItemEventArgs e)
{
var myControl = (DropDownList)e.Item.FindControl("DropDownList1");
if (myControl != null)
{
Label5.Text = ("Found");
}
else
{
Label5.Text = ("Not found");
}
}
protected void Page_Load(object sender, EventArgs e)
{
}
}
site.aspx
<div id="form-view">
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:practiceConnectionString %>"
SelectCommand="SELECT k.idKlienci, k.imie, k.nazwisko, k.adres, k.miasto, r.idRezerwacje, r.data, r.godzina, r.idKlienci FROM klienci AS k INNER JOIN rezerwacje AS r ON k.idKlienci = r.idKlienci"
UpdateCommand="UPDATE Klienci SET imie = @imie, nazwisko = @nazwisko, adres = @adres, miasto = @miasto WHERE (idKlienci = @IdKlienci)UPDATE rezerwacje SET data = @data, godzina = @godzina WHERE (idRezerwacje = @idRezerwacje)"
></asp:SqlDataSource>
<asp:ListView ID="ListView1" runat="server" DataSourceID="SqlDataSource1" DataKeyNames="idRezerwacje, idKlienci" ConvertEmptyStringToNull="true" OnItemDataBound="Item_Bound">
<LayoutTemplate>
<asp:DataPager ID="DataPager1" runat="server" PageSize="10" >
<Fields>
<asp:NextPreviousPagerField ButtonType="Link" ButtonCssClass="pagin" ShowFirstPageButton="true"/>
<asp:NumericPagerField NumericButtonCssClass="pagin" CurrentPageLabelCssClass="pagin"/>
</Fields>
</asp:DataPager>
<table cellpadding="2" runat="server" id="tblDepartments" width="640px" cellspacing="1">
<tr id="Tr1" runat="server" class="TableHeader">
<td id="Td1" runat="server">Edycja</td>
<td id="Td2" runat="server">imie</td>
<td id="Td3" runat="server">nazwisko</td>
<td id="Td7" runat="server">adres</td>
<td id="Td8" runat="server">miasto</td>
<td id="Td5" runat="server">data</td>
<td id="Td6" runat="server">godzina</td>
</tr>
<tr runat="server" id="itemPlaceholder" />
</table>
</LayoutTemplate>
<EditItemTemplate>
<tr >
<td>
<asp:Button ID="UpdateButton" runat="server" CommandName="Update" Text="Update" />
<asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="Cancel" />
</td>
<td>
<asp:Label runat="server" ID="NameLabel" AssociatedControlID="NameTextBox" Text="Imie" Font-Bold="true"/><br />
<asp:TextBox ID="NameTextBox" runat="server" Text='<%#Bind("imie") %>' />
</td>
<td>
<asp:Label runat="server" ID="GroupNameLabel" AssociatedControlID="SurnameTextBox" Text="Nazwisko" Font-Bold="true" /><br />
<asp:TextBox ID="SurnameTextBox" runat="server" Width="150px" Text='<%#Bind("nazwisko") %>' />
<br/>
</td>
<td>
<asp:Label runat="server" ID="Label1" AssociatedControlID="AdressTextBox" Text="Adres" Font-Bold="true" /><br />
<asp:TextBox ID="AdressTextBox" runat="server" Width="150px" Text='<%#Bind("adres") %>' />
<br/>
</td>
<td >
<asp:Label runat="server" ID="Label2" AssociatedControlID="CityTextBox" Text="Miasto" Font-Bold="true" /><br />
<asp:TextBox ID="CityTextBox" runat="server" Width="150px" Text='<%#Bind("miasto") %>' />
<br/>
</td>
<td class="EditItem">
<asp:Label runat="server" ID="Label3" AssociatedControlID="DateTextBox" Text="Data" Font-Bold="true" /><br />
<div id="ab">
<div id="a"><asp:TextBox ID="DateTextBox" runat="server" ClientIDMode="Static" Width="100px" Text='<%#Bind("data") %>' /></div>
<div id="b"><asp:image ID="Image1" runat="server" CssClass="image" style="cursor:hand;" onclick="PopupDatePicker('DateTextBox')" ImageUrl="~/image/ikon.png" /></div>
</div>
</td>
<td >
<asp:Label runat="server" ID="Label4" Text="Godzina" Font-Bold="true" /><br />
<asp:DropDownList ID="DropDownList1" runat="server"></asp:DropDownList>
</td>
</tr>
</EditItemTemplate>
<ItemTemplate>
<tr runat="server">
<td>
<asp:Button ID="EditButton" runat="server" Text="Edit" CommandName="Edit" />
</td>
<td>
<asp:Label ID="NameLabel" runat="server" Text='<%#Eval("imie") %>' />
</td>
<td>
<asp:Label ID="SurnameLabel" runat="server" Text='<%#Eval("nazwisko") %>' />
</td>
<td>
<asp:Label ID="AdressLabel" runat="server" Text='<%#Eval("adres") %>' />
</td>
<td>
<asp:Label ID="CityLabel" runat="server" Text='<%#Eval("miasto") %>' />
</td>
<td>
<asp:Label ID="DataLabel" runat="server" Text='<%#Eval("data") %>' />
</td>
<td>
<asp:Label ID="TimeLabel" runat="server" Text='<%#Eval("godzina") %>' />
</td>
</tr>
</ItemTemplate>
</asp:ListView>
</div>
w końcu sobie poradziłem, należało najpierw przejrzeć wszystkie Itemy w listview i w nich szukać dropdawnlist, wrzucam kod może komuś się przyda :) dzięki za pomoc somekind miałeś duży wkład :)
protected void Item_Bound(object sender, ListViewItemEventArgs e)
{
foreach (var listItem ListView1.Items)
{
DropDownList dropdownlist = e.Item.FindControl("DropDownList1") as DropDownList;
string ktr, mtr;
for (int k = 0; k < 24; k++)
{
for (int m = 0; m < 60; m = m + 5)
{
if (k < 10)
{
ktr = "0" + k.ToString();
}
else
{
ktr = k.ToString();
}
if (m < 10)
{
mtr = "0" + m.ToString();
}
else
{
mtr = m.ToString();
}
dropdownlist.Items.Add(new ListItem(ktr + ":" + mtr));
}
}
}
}
Dropdownlist jest wypiełniony godzinami tak jak chciałem, pozdrawiam :)
@Rejencina, ale ta pętla nie jest Ci do niczego potrzebna. Przecież nigdzie nie odwołujesz się do zmiennej listItem
. A zdarzenie ItemBound i tak jest wywoływane dla każdego itemu, więc samo w sobie jest tak jakby wywoływane w pętli.
Poza tym, zamiast:
if (k < 10)
{
ktr = "0" + k.ToString();
}
else
{
ktr = k.ToString();
}
Można napisać po prostu
ktr = k.ToString("D2");
No i pytanie zasadnicze, po co komu dropdown wypełniony godzinami? Zawsze jak coś takiego widzę mam ochotę powiesić kogoś za ratuszem.
tutaj Cie zaskoczę bo komentując tą pętlę, program się wysypuję :D co do if'a trafna uwaga, dzięki :) a dlaczego dropdownlist wypełniony godzinami? edytując wiersz możemy w szybki i prosty sposób wybrać godzinę, nie używając text boxa. A według Ciebie jest to karygodne, jeżeli tak to dlaczego ?:) Pozdrawiam
Rejencina napisał(a):
tutaj Cie zaskoczę bo komentując tą pętlę, program się wysypuję :D
A z jakim błędem? Bo jeśli takie rzeczy się dzieją, to znaczy, że coś naprawdę jest nie tak, i pewno niedługo problem powróci ze zdwojoną siłą.
edytując wiersz możemy w szybki i prosty sposób wybrać godzinę, nie używając text boxa. A według Ciebie jest to karygodne, jeżeli tak to dlaczego ?:) Pozdrawiam
Bo textbox jest wygodniejszy. Są też lepsze sposoby niż okropnie długa lista, np.: https://fgelinas.com/code/timepicker/
po usunięciu pętli wyrzuca wyjątek NullReferenceException "Object reference not set to an instance of an object." ale zaobserwowałem coś dziwnego... pracuję na dwóch różnych wersjach visual'a w domu używam visual 2013, natomiast na praktykach 2010. Powyższy kod jaki podałem działa na wersji 2013!!!!! a dla 2010 już wyrzuca ten błąd, totalna abstrakcja :D Chyba raczej użyje timepicker'a. Pozdrawiam
Rejencina napisał(a):
po usunięciu pętli wyrzuca wyjątek NullReferenceException "Object reference not set to an instance of an object."
A konkretnie w którym miejscu ten wyjątek rzuca?
Problemy zazwyczaj lepiej jest rozwiązywać niż obchodzić.
ale zaobserwowałem coś dziwnego... pracuję na dwóch różnych wersjach visual'a w domu używam visual 2013, natomiast na praktykach 2010. Powyższy kod jaki podałem działa na wersji 2013!!!!! a dla 2010 już wyrzuca ten błąd, totalna abstrakcja
To raczej nie od wersji VS lecz od .NET Framework może zależeć. W obu IDE otwierasz ten sam projekt?
udało mi się napisać coś takiego, póki co program działa bez zarzutów, ale wieczorem sprawdzę jeszcze na 2013 :D co do projektu to dwa różne, ale dzisiaj wezmę ze sobą oryginał do sprawdzenia, dziękuje za zainteresowanie i pozdrawiam
protected void Item_Bound(object sender, ListViewItemEventArgs e)
{
if (e.Item.ItemType == ListViewItemType.DataItem)
{
DropDownList ddl = e.Item.FindControl("DropDownList1") as DropDownList;
if (null != ddl)
{
string ktr, mtr;
for (int k = 8; k < 20; k++)
{
for (int m = 0; m < 60; m = m + 5)
{
ktr = k.ToString();
if (m < 10)
{
mtr = "0" + m.ToString();
}
else
{
mtr = m.ToString();
}
ddl.Items.Add(new ListItem(ktr + ":" + mtr));
}
}
}
}
}
Rejencina napisał(a):
co do projektu to dwa różne, ale dzisiaj wezmę ze sobą oryginał do sprawdzenia, dziękuje za zainteresowanie i pozdrawiam
Czyli problemem są różne projekty, a nie ten sam projekt w dwóch IDE.
Po co pisać więcej kodu niż potrzeba?
for (int k = 8; k < 20; k++)
{
for (int m = 0; m < 60; m = m + 5)
{
ddl.Items.Add(new ListItem(string.Format("{0:D2}:{1:D2}", k, m);
}
}