none
basit bir algoritma sorunu RRS feed

  • Soru

  • <td align="Center"><a><img src="/images/toolimages/open_kucuk.gif"  onmouseover="this.src='/images/toolimages/open_kucuk_a.gif';this.style.cursor='hand';"  onmouseout="this.src='/images/toolimages/open_kucuk.gif';this.style.cursor='default';" alt="Öğrenci" onclick="FormSec(000000000000);" /></a></td><td align="Left">000000000000</td><td align="Left">GÖKÇE</td><td align="Left">TEKÇAM</td><td align="Left">51</td><td align="Left">1. Sınıf / C Şubesi</td><td align="Left">Aktif  öğrenci</td>
     </tr><tr style="background-color:White;">
     <td align="Center"><a><img src="/images/toolimages/open_kucuk.gif"  onmouseover="this.src='/images/toolimages/open_kucuk_a.gif';this.style.cursor='hand';"  onmouseout="this.src='/images/toolimages/open_kucuk.gif';this.style.cursor='default';" alt="Öğrenci" onclick="FormSec(111111111111);" /></a></td><td align="Left">111111111111</td><td align="Left">DURU</td><td align="Left">KONANÇ</td><td align="Left">65</td><td align="Left">1. Sınıf / C Şubesi</td><td align="Left">Aktif  öğrenci</td>
     </tr><tr>
     <td align="Center"><a><img src="/images/toolimages/open_kucuk.gif"  onmouseover="this.src='/images/toolimages/open_kucuk_a.gif';this.style.cursor='hand';"  onmouseout="this.src='/images/toolimages/open_kucuk.gif';this.style.cursor='default';" alt="Öğrenci" onclick="FormSec(22222222222);" /></a></td><td align="Left">22222222222</td><td align="Left">SUDE</td><td align="Left">KILINÇARSLAN</td><td align="Left">302</td><td align="Left">1. Sınıf / C Şubesi</td><td align="Left">Aktif  öğrenci</td>

    diye giden yüzlerce satır var. Ben normalde buton ile en üstteki FormSec(000000000000); ı seçtiriyorum fakat benim bunu bir döngüye sokup hepsine tıklatmam lazım..

    bunu nasıl bir döngüye sokabilirim?
    her döngüde onclick içindeki örneğin metod("ForSec(000000000000);"); yaptıracağım..
    yani onclick içindekini metodla göndereceğim fakat onları nasıl döngüye sokacağımı bir türlü bulamadım..




    28 Haziran 2011 Salı 08:38

Yanıtlar

  • buton ile yapınca dediğiniz gibi oluyor teşekkürler.

     

    yanlız benim istedigim tıklamak degilde onları bir diziye atmak..,

     

    foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("img"))

                {

                    if (el.GetAttribute("onclick") != string.Empty)

                    {

                        MessageBox.Show(el.InnerText.ToString());

                    }

                }

    o yüzden el.InnerText.toString() kullandım o da null döndü nasıl onclick içindeki "FormSec("111111111);" i seçebilirim? 

    MessageBox.Show(el.GetAttribute("onclick")); yaptım fakat ondada olmadı.. system._objec.. diyor

     

     


    Bu başlıktaki mesajınızla da doğrudan ilintili bu soru için; IMG elementlerinin onclick özniteliği içerisindeki FormSec methoduna parametre olarak geçilen numaraları (TCKimlik demiştin) almak istiyorsunuz ve diziye eklemek istiyorsunuz. Doğru mu?

    Dizi yerine dinamik olarak çalışma anında popüle edilebilen koleksiyon türü sınıfları kullanın:

    Örneğin (yolladığınız ilk mesajdaki gibi) HTML kodu şu şekilde olan IMG için:

    <img src="/images/toolimages/open_kucuk.gif"  onmouseover="this.src='/images/toolimages/open_kucuk_a.gif';this.style.cursor='hand';"  onmouseout="this.src='/images/toolimages/open_kucuk.gif';this.style.cursor='default';" alt="Öğrenci" onclick="FormSec(22222222222);" />

    //Her zaman 11 haneli bir TCKimlikNo olacağının varsayımı altında

      System.Collections.ArrayList arrlist = new System.Collections.ArrayList();
                foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("img"))
                {

                    if (el.GetAttribute("onclick") != string.Empty)
                    {

                        string sayi = el.OuterHtml.Substring(el.OuterHtml.IndexOf("FormSec") + 8,11);
                        arrlist.Add(sayi);

                    }

                }

    //Diziyi oku, ispat et:

     foreach (object obj in arrlist)
                {
                    MessageBox.Show(Convert.ToString(obj));
                }

    ' örnek çıktı "22222222222" ve diğer numaralar olacaktır...

    ...ile FormSec'e argüman olarak geçtiğiniz 11 haneli numaraların koleksiyona eklenmiş olduğuna inanacaksınız.

    İyi çalışmalar.


    Best regards, Saygılarımla, Onur Güzel

    Yazgeliştir Forumları VB.NET / C# Süper Moderatorü.

    Microsoft Haber Grupları Profilim (VB.NET)





    • Yanıt Olarak İşaretleyen captix 29 Haziran 2011 Çarşamba 14:54
    28 Haziran 2011 Salı 15:38
    Moderatör

Tüm Yanıtlar

  • merhaba 

    "FormSec(111111111111) içeriği nedir acaba 


    Emre ARAS Microsoft Certified Learning Consultant MCPD - MCT
    28 Haziran 2011 Salı 08:57
    Moderatör
  • Function FormSec(TCKimlikNo)
     Dim frm 
     set frm = document.forms("Form1")
     frm.hdnSecimKnt.value = TCKimlikNo
     frm.submit()
    end function
    yazıyor hocam.
    zaten ben onu çalıştırabiliyorum Invoke olayı ile. bana o döngüye nasıl gireceğim lazım. kafayı çok yordum, yardım bekliyorum.

    28 Haziran 2011 Salı 08:59
  • şeymi yapsak acaba?

    tc'leri bir diziye atsak (000000000,11111111) sonra içinde gerekli işlemleri yaptıktan sonra sırayla onları okutsak?

    acaba başka bir yöntem mümkün mü

    28 Haziran 2011 Salı 09:23
  • Merhaba,

     

    Yerinizde olsam bulmak istedigim bilgiye ulasmak icin once ham bilgiyi Regex'ler yardimiyla anlamli bir veri (bi customized obje) haline cevirirdim.

     

    Mesela

    <(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>

    buna benzer bir regex kullanarak once butun taglari ve icerigineki bilgileri bir Hashtable veya bir Dictionary objesine atar daha sonra icerisinden diledigim gibi manipulasyon yapardim.

    Internetde biraz dolasirsaniz ulasmak istediginiz Regex'i bulabilirsiniz cok zaman kaybetmeden.

     

    Iyi Calismalar :)

    28 Haziran 2011 Salı 10:59
  • hocam yanlız bu c# uygulaması olacak moderator arkadaş buraya taşımış ama burası değil belirtmek isterim.

     

    kubi_ozi hocam, yanlız bir regex direk FormSec(222222222) [11tane rakam] ı yakalayabilir mi? ayrıca ondan bicok defa kaynak kodda mevcut olur sanırım?

     

    nasıl mümkün olur ki böyle bişey?

    28 Haziran 2011 Salı 11:24
  • captix kusura bakmayın ben taşıma işlemini yaptım bir web uygulaması olduğunu sanıp. Tekrar C# Forumuna taşıyorum.

    Anlayışınız için teşekkürler.


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
    Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi bir sorumluluk üstlenildiği anlamına gelmez.
    Facebook Üzerinden Takip Et!
    Twitter'da Takip Et!


    28 Haziran 2011 Salı 11:26
    Moderatör
  • Selam captix,

    Aslında tek yapman gereken tüm elementlerin "onclick" özniteliklerini okuyup FormSec için sorgulamak :)

    Şöyle birşey dene:

    (Doğru anladıysam) FormSec methoduna haiz tüm img elementlerinin Click olayını invoke etmek:

     foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("img"))
                {
                            
                    if (el.GetAttribute("onclick") != string.Empty)
                    {
                        el.InvokeMember("click");
                    }
                }

    ...şeklinde deneyiniz. Kod, döngü ile tüm "img" elementlerinin onclick özniteliği var ise tıklar yoksa birşey yapmaz.

    Not: TCKimlik No 11 haneli olmalıdır, sizin örnekler daha fazla mesela 12 haneli?


    Best regards, Saygılarımla, Onur Güzel

    Yazgeliştir Forumları VB.NET / C# Süper Moderatorü.

    Microsoft Haber Grupları Profilim (VB.NET)


    28 Haziran 2011 Salı 12:55
    Moderatör
  • onları ben salladıgım için öyle saymamışım.

     

    foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("img"))

                    {

                        if (el.GetAttribute("onclick") != string.Empty)

                        {

                            el.InvokeMember("click");

                        }

                    }

    çalışmadı hocam, hiçbir tepki yok. onun yerine

     if (el.GetAttribute("onclick").Contains("FormSec"))

                        {

                            MessageBox.Show(el.GetAttribute("onclick").ToString());

                        }

    yaptım. bu da oynamadı. sebebi nedir acaba

    28 Haziran 2011 Salı 13:03
  • onları ben salladıgım için öyle saymamışım.

     

     

    foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("img"))

                    {

                        if (el.GetAttribute("onclick") != string.Empty)

                        {

                            el.InvokeMember("click");

                        }

                    }

    çalışmadı hocam, hiçbir tepki yok. onun yerine

     

     if (el.GetAttribute("onclick").Contains("FormSec"))

                        {

                            MessageBox.Show(el.GetAttribute("onclick").ToString());

                        }

    yaptım. bu da oynamadı. sebebi nedir acaba

     

     

    İkinci bahsettiğiniz yöntem yani koyu yer akla ilk gelen yöntem ancak çalışmaması normal çünkü dönen değer System.__comobject yani script örneğinin kendisi olduğundan ilk yöntemi uygulamak durumundaydık.

    Konu ile ilgili detaylı bilgi:

    http://stackoverflow.com/questions/6223840/how-to-get-actual-javascript-value-in-onclick-from-webbrowser-control

    ..linkindeki alternatifleri deneyebilirsiniz.

    İlk yöntemi denediğimde (kodları yazdıktan sonra bizzat deneyerek yolluyorum) bir problem oluşmadı. Img olan ve onclick özniteliği olan tüm elementlerin onclick karşılığında bulunan scriptler çalıştı (alert gibi). Yine döküman yüklenmesini beklemenizi tavsiye edeceğim.


    Best regards, Saygılarımla, Onur Güzel

    Yazgeliştir Forumları VB.NET / C# Süper Moderatorü.

    Microsoft Haber Grupları Profilim (VB.NET)



    28 Haziran 2011 Salı 13:16
    Moderatör
  • buton ile yapınca dediğiniz gibi oluyor teşekkürler.

     

    yanlız benim istedigim tıklamak degilde onları bir diziye atmak..,

     

    foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("img"))

                {

                    if (el.GetAttribute("onclick") != string.Empty)

                    {

                        MessageBox.Show(el.InnerText.ToString());

                    }

                }

    o yüzden el.InnerText.toString() kullandım o da null döndü nasıl onclick içindeki "FormSec("111111111);" i seçebilirim? 

    MessageBox.Show(el.GetAttribute("onclick")); yaptım fakat ondada olmadı.. system._objec.. diyor

     

     


    28 Haziran 2011 Salı 13:44
  • HtmlElementCollection inputs = webBrowser1.Document.GetElementsByTagName("img");
                foreach (HtmlElement input in inputs)
                {
                    if (input.GetAttribute("src") == "/images/toolimages/open_kucuk.gif")
                    {
                        string adi = input.GetAttribute("onclick");
                        MessageBox.Show(adi);
                    }
                }
    <img src="/images/toolimages/open_kucuk.gif" onmouseover="this.src='/images/toolimages/open_kucuk_a.gif';this.style.cursor='hand';" onmouseout="this.src='/images/toolimages/open_kucuk.gif';this.style.cursor='default';" alt="Öğrenci" onclick="FormSec(11111111111111);" />
    bu da olmadı. FormSec niye dönmüyor?
    28 Haziran 2011 Salı 13:51
  • buton ile yapınca dediğiniz gibi oluyor teşekkürler.

     

    yanlız benim istedigim tıklamak degilde onları bir diziye atmak..,

     

    foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("img"))

                {

                    if (el.GetAttribute("onclick") != string.Empty)

                    {

                        MessageBox.Show(el.InnerText.ToString());

                    }

                }

    o yüzden el.InnerText.toString() kullandım o da null döndü nasıl onclick içindeki "FormSec("111111111);" i seçebilirim? 

    MessageBox.Show(el.GetAttribute("onclick")); yaptım fakat ondada olmadı.. system._objec.. diyor

     

     


    Bu başlıktaki mesajınızla da doğrudan ilintili bu soru için; IMG elementlerinin onclick özniteliği içerisindeki FormSec methoduna parametre olarak geçilen numaraları (TCKimlik demiştin) almak istiyorsunuz ve diziye eklemek istiyorsunuz. Doğru mu?

    Dizi yerine dinamik olarak çalışma anında popüle edilebilen koleksiyon türü sınıfları kullanın:

    Örneğin (yolladığınız ilk mesajdaki gibi) HTML kodu şu şekilde olan IMG için:

    <img src="/images/toolimages/open_kucuk.gif"  onmouseover="this.src='/images/toolimages/open_kucuk_a.gif';this.style.cursor='hand';"  onmouseout="this.src='/images/toolimages/open_kucuk.gif';this.style.cursor='default';" alt="Öğrenci" onclick="FormSec(22222222222);" />

    //Her zaman 11 haneli bir TCKimlikNo olacağının varsayımı altında

      System.Collections.ArrayList arrlist = new System.Collections.ArrayList();
                foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("img"))
                {

                    if (el.GetAttribute("onclick") != string.Empty)
                    {

                        string sayi = el.OuterHtml.Substring(el.OuterHtml.IndexOf("FormSec") + 8,11);
                        arrlist.Add(sayi);

                    }

                }

    //Diziyi oku, ispat et:

     foreach (object obj in arrlist)
                {
                    MessageBox.Show(Convert.ToString(obj));
                }

    ' örnek çıktı "22222222222" ve diğer numaralar olacaktır...

    ...ile FormSec'e argüman olarak geçtiğiniz 11 haneli numaraların koleksiyona eklenmiş olduğuna inanacaksınız.

    İyi çalışmalar.


    Best regards, Saygılarımla, Onur Güzel

    Yazgeliştir Forumları VB.NET / C# Süper Moderatorü.

    Microsoft Haber Grupları Profilim (VB.NET)





    • Yanıt Olarak İşaretleyen captix 29 Haziran 2011 Çarşamba 14:54
    28 Haziran 2011 Salı 15:38
    Moderatör
  • Acikcasi yazip denemedim daha once boyle birsey ama olmamasi icin bir sebep gorunmuyor.

    FormSec(xxxxxxxx) icin bir regex formati yazilabilir. Ama ben cok farkli bir cozum sundum aslinda.. Butun Tag ve Attributelar ve bunlarin degerleri bir Dictionary icerisine atildiktan sonra soyle bir dongu yapilabilir.

     

     

    Dictionary<string, string> htmlKeyValues = BunuOlusturanFonksiyon(); 
    
    var istenilenDegerler = htmlKeyValues.Values.Where(tag=>tag.Contains("FormSec"));
    
    foreach(string formSec in istenilenDegerler)
    
    formSec = formSec.Replace("FormSec(", "" ).Replace(")", "");
    


    Hatta burda Dictionary'deki valuelar daha komplex bir yapiysa string yerine o yapidada tutulabilir.

    Su an visual studio olmadigindan kafadan yaziverdim. Bir ara zamanim olursa deneyip paylasabilirim.

     

     



    29 Haziran 2011 Çarşamba 10:32
  •  

    burdaki değerleri string diziye aktarmak istiyorum ancak beceremedim.

    teşekkürler meğer "img/logo.gif" gibi yapıyormuşum oradaki / yüzünden şarta girmiyormuş..

     

                string[] x;

                int i = 0;

                foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("img"))

                {

                    if (el.GetAttribute("alt") == "Öğrenci Bilgisini Düzeltmek İçin Tıklayınız.")

                    {

                        string sayi = el.OuterHtml.Substring(el.OuterHtml.IndexOf("FormSec")+8,11);

                         x[i++] = sayi;

                    }

                }

     

     

    yapıyorum fakat x dizisine aktaramıyorum..

    Use of unassigned local variable 'x'
    ///////////////////////////////////////////////////////////
    string[] x; i en tepeye alıp, (metodların üstüne) çalıştırdığımda NullReferenceException hatası veriyor


    29 Haziran 2011 Çarşamba 15:10
  • Selam,

    Hala dizi kullanmakta ısrarcı olmanızdan dolayı hata normal. Şöyle ki, .NET'de dizi bildirimi yaparken dizi büyüklüğü önceden belirtilmiş olmalıdır. Runtime buna göre bellekte dizi için yer ayıracaktır. Döküman değişik sayıda TCKimlik No içerebileceğinden bu sağlıksızdır. Sizinde VB'deki Redim/ReDim Preserve gibi dinamik olarak diziyi yeniden boyutlandırmanız gerekir. Bu da çok kullanışlı değildir. (Hele C#'da).

    Bunun yerine koleksiyonları (ArrayList, List(Of String)) gibi nesneleri kullanırsanız dinamik olarak CLR bu işlemleri sizin yerinize yapar. Ayrıeten eleman eklemek çıkarmak tek bir method ile (Add/Remove) mümkün olup, element erişimide aynen dizilerdeki gibi indexerlar vasıtasyla yapılmaktadır. Bir önceki yolladığım kodda sorun olmadığını düşünüyorum, deneyiniz.

    Kolay gelsin.


    Best regards, Saygılarımla, Onur Güzel

    Yazgeliştir Forumları VB.NET / C# Süper Moderatorü.

    Microsoft Haber Grupları Profilim (VB.NET)



    29 Haziran 2011 Çarşamba 16:32
    Moderatör
  • ne demek istediğinizi anladım hocam

    peki ben

    Convert.ToString(dizi[sayac])  gibi dizinin n. değerini nasıl alabilirim?

     

    string kelime = { "/" + Convert.ToString(dizi[sayac]) + "/" };

                    textBox4.Text = Convert.ToString("öğrenci listesi sayfasındasın.");

                    MyInvokeScript("FormSec", kelime);

    yapıp

    private object MyInvokeScript(string name, params object[] args) 

            { 

                return webBrowser1.Document.InvokeScript(name, args);

            }

     

    yapmaya çalışıyorum  

    29 Haziran 2011 Çarşamba 16:38