ASP.NET DropDownList findControl

0

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

0

Głowy nie dam ale być może musisz odwołać poprzez pole z listviewa

0

jak mógłbys podać jakis przykład był bym wdzięczny :)

0

DropDownList ddl = (DropDownList) this.Listview1.FindControl("DropDownList1")

1

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;
0

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));

                }
            }
        }
    }

update.png

0

Podczas Page_Load ten DropDownList nie istnieje. Zrób to w zdarzeniu ItemDataBound.

0

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?

0

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.

0

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

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 :)

0

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

0

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

0
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/

0

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

0
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?

0

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));

                    }
                }
            
            }
        }
    }
1
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); 
                    }
                }

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.