nastavení události dynamicky vytvořenému prvku   otázka

ASP.NET WebForms

Dobrý den, poradil by někdo, jak nastavit OnClick, OnLoad, nebo např OnTextChanged u dynamicky vytvořeného prvku na stránce?

V page_init mám mimo jiného :

Dim Polozka_Insert As New System.Web.UI.WebControls.TextBox
    Polozka_Insert.ID                  = "Polozka"
    Polozka_Insert.Width               = Polozka_Width
    Polozka_Insert.Height              = Item_Height
    Polozka_Insert.Attributes("Style") = Item_Style
    Polozka_Insert.OnTextChanged       = vyhledej_polozku_a_vloz_do_radku
Me.Form.Controls.Add(Polozka_Insert)

a dále poté...

Protected Sub vyhledej_polozku_a_vloz_do_radku(ByVal sender As Object, ByVal e As System.EventArgs)
   'Nějaké příkazy
End Sub

IIS mi odpoví že :

BC30390: Metoda System.Web.UI.WebControls.TextBox.Protected Overridable Sub OnTextChanged(e As System.EventArgs) není v tomto kontextu k dispozici, protože je Protected.

Neměl by jste někdo zkušenost s tím jak to vyřešit?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Handler se přidává jinak:

Me.Polozka_Insert.OnTextChanged += New System.EventHandler(Me.Polozka_Insert_OnTextChanged)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Omlouvám se, ale měl jsem dotaz již ze začátku směřovat jinak... Asi zkusím spíše popsat o co se pokouším v globálu.

Snažím se vytvořit přehledový formulář s daty z tabulky v databázi s tím, že na každém řádku (Items) bude možnost tzv. řádkového ukládání.

Abych lépe specifikoval co to je, popíšu postupy, které jsem již zkoušel:

Vytvořil jsem DataList, A v ItemDataBound tohoto datalistu jsem definoval, co se má do datalistu načítat. (asi takto...)

Private Sub DataList1_ItemDataBound(sender As Object, e As DataListItemEventArgs)

   Dim cnn_4 As New SqlConnection (System.Configuration.ConfigurationSettings.AppSettings("alfweb_Connection"))
   Dim cmd_4 As New SqlCommand    ("SELECT * From [SKL_SP_DokladyR] Where [DokladId] = @DokladId and CisloRadku = @CisloRadku", cnn_4)
       cmd_4.Parameters.Add       ("@DokladId", SqlDbType.Varchar, 50).Value   = CType(e.Item.FindControl("hf_DokladId"), HiddenField).Value
       cmd_4.Parameters.Add       ("@CisloRadku", SqlDbType.Varchar, 50).Value  = CType(e.Item.FindControl("hf_CisloRadku"), HiddenField).Value
       cnn_4.open()
   Dim dtr_4 As SqlDataReader = cmd_4.ExecuteReader()
   
   If dtr_4.Read() Then
      CType(e.Item.FindControl("CisloRadku"), TextBox).Text                 = dtr_4("CisloRadku").ToString()
      CType(e.Item.FindControl("StavRadku"), TextBox).Text                  = dtr_4("StavRadku").ToString()
      CType(e.Item.FindControl("Sklad"), TextBox).Text                      = dtr_4("Sklad").ToString()
      CType(e.Item.FindControl("Stroj"), TextBox).Text                      = dtr_4("Stroj").ToString()
      CType(e.Item.FindControl("Polozka"), TextBox).Text                    = dtr_4("Polozka").ToString()
      CType(e.Item.FindControl("Popis1"), TextBox).Text                     = dtr_4("Popis1").ToString()
      CType(e.Item.FindControl("Varianta1"), DropDownList).SelectedValue    = dtr_4("Varianta1").ToString()
      CType(e.Item.FindControl("MnozstviMj"), TextBox).Text                 = dtr_4("MnozstviMj").ToString()
      CType(e.Item.FindControl("MnozstviZj"), TextBox).Text                 = dtr_4("MnozstviZj").ToString()
      CType(e.Item.FindControl("MeJednotka"), TextBox).Text                 = dtr_4("MeJednotka").ToString()
      CType(e.Item.FindControl("ZaJednotka"), TextBox).Text                 = dtr_4("ZaJednotka").ToString()
   End If   

   dtr_4.close()
   cnn_4.close() 

End Sub

Řekněme, že nyní se mi do datalistu načetlo X záznamů, a já bych potřeboval data měnit přímo přepsáním hodnot v načtených datech.

Například v items(3) upravím hodnotu v TextBoxu s id "polozka" opusím TextBox, a provede se akce v databázi.

Aby to ovšem bylo ještě zajímavější, tak je třeba, aby jednotlivé prvky v items(3) na sebe měli návaznost. Tzn že pokud například upravím hodnotu v již zmiňovaném TextBoxu "Polozka", odešle se dotaz do databáze, který vyhledá k této položce Popis a ten mi vrátí do TextBoxu v Items(3) s id "Popis1" a v případě že v databázi nenajde, vrátí do obou polí prázdnou hodnotu.

Pro tento učel jsem si vytvořil:

Protected Sub vyhledej_polozku_a_vloz_do_radku(ByVal sender As Object, ByVal e As System.EventArgs)

   Dim cnn_p7 As New SqlConnection (System.Configuration.ConfigurationSettings.AppSettings("alfweb_Connection"))
   Dim txt_p7 As String = "Select Id, Prepocet, MeJednotka, (Select Popis1 From Skl_Cs_PolozkyH Where Id = Skl_Cs_PolozkyR.Id) as Popis, (Select ZaJednotka From Skl_Cs_PolozkyH Where Id = Skl_Cs_PolozkyR.Id) as ZaJednotka From Skl_Cs_PolozkyR Where EanKod = @Promena_Polozka And (Select TypPolozky From Skl_Cs_PolozkyH Where Id = Skl_Cs_PolozkyR.Id) = 'OB'"
   Dim cmd_p7 As New SqlCommand    (txt_p7, cnn_p7)
       cmd_p7.Parameters.Add       ("@Promena_polozka", SqlDbType.Varchar, 50).Value = Polozka.text
       cnn_p7.open()
   Dim dtr_p7 As SqlDataReader = cmd_p7.ExecuteReader()

   If dtr_p7.Read() Then
      Polozka.text             = dtr_p7("Id").ToString()
      Popis1.text              = dtr_p7("Popis").ToString()
      MeJednotka.Text          = dtr_p7("MeJednotka").ToString()
      ZaJednotka.Text          = dtr_p7("ZaJednotka").ToString()
      MnozstviMj.Text          = "1,00"
      MnozstviZj.Text          = dtr_p7("Prepocet").ToString()
      Varianta1.Focus()
   Else
      Polozka.text             = ""
      Popis1.text              = ""
      MeJednotka.Text          = ""
      ZaJednotka.Text          = ""
      MnozstviMj.Text          = ""
      MnozstviZj.Text          = ""
      Stroj.Text               = ""
      MeJednotka.Enabled  = "True"
      Polozka.Focus()
   End If   

   dtr_p7.close()
   cnn_p7.close()
   
End Sub

Jenže neumím v něm specifikovat v jakém Items() v DataListu jsem TextBox "Položka" editoval, a do jakého Items() v DataListu se má výsledek odeslat.

Proto jsem si naivně myslel, že si prvky nechám vygenerovat dynamicky přímo do <Form>, bez použití DataListu s tím, že id prvku budu naplňovat přímo primárním klíčem záznamu v tabulce, a pak budu umět specifikovat jaký TextBox Edituji a do jakého TextBoxu se má vrátit hodnota. Toto mi ovšem také nevyšlo.

Já bych asi potřeboval jen radu od někoho, kdo již něco podobného řešil, a ukázal mi jen směr, kterým by to šlo vyřešit. Napadlo mě například načítat si ClientId editovaného items() do QueryStringu ale to mi nepřipadá moc elegantní řešení. Nebo nějak využít PostBack ale přiznám se, že nevím jak.

Omlouvám se, že jsem z toho udělal román, nebo že to vysvětluji moc složitě a zdlouhavě. Pokud by měl někdo chuť na to odpovědět, tak budu vděčný za každé nakopnutí.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A nebylo by lepší použít např.FormView,které obsahuje editovací režim,atd.?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Myslíte vnořit FormView s defaultmode=Edit do Items()DataListu?

To si ale myslím, že můj problém nevyřeší... Editace záznamu v databázi je závislá na jiných funkcích viz. výše. Nebo možná jen nevím jak to myslíte.

Zkusil jsem si ten postup s uložením ClientId do QueryString, pak jsem si již funkci nasměroval na správná id TextBoxů v datalistu, ...

..Ale vůbec se mi to nelíbí :-D

Kdybych tak věděl, zda by šel k tomuto účelu využít PostBack...

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