Yazılım.
CevapSitesi.com Beta!
Çözüm Noktası
Facebook, Twitter, Google+ veya e-posta ile paylaşın.
| Sorular | Makaleler | Üyeler | Etiketler  | İletişim
Soru sormak ya da cevap vermek için;
giriş yapın veya üye olun.

Sosyal medya hesaplarınızla da giriş yapabilirsiniz.

Yazılım Soruları

0

WebBrowser içindeki sayfada bulunan tablodaki verileri veritabanına kaydetmek

Bir form içindeki WebBrowser kontrolünün görüntülediği web sayfası içinde bir tablo var. Bu tablodaki verileri veritabanına kaydetmek istiyorum.

Nasıl yapabilirim?

1 Cevap

0
Bunu yapabilmek için tablonun id değerini bilmen lazım. Eğer id değeri yokas tablonun HTML içinde kaçıncı tablo olduğunu bilmelisin veya tüm tabloları gezip kendi tablonu bulmalısın. Bunlar biraz daha uzun konular.

Bu örnek tablonun id değerini bildiğininde değerleri nasıl alacağını gösterir.

Verdiğin Örnek

...<table class="frmList" cellspacing="0" cellpadding="1" rules="all" id="dgListe" style="border-color:#CCCCCC;border-width:1px;border-style:solid;width:100%;border-collapse:collapse;">
		<tbody><tr>
			<td class="frmListBaslik" align="center">Sıra</td>
			<td class="frmListBaslik" align="center" bgcolor="#FFFF00">
			Adı</td><td class="frmListBaslik" align="center" bgcolor="#FFFF00">Soyadı</td>
			<td class="frmListBaslik" align="center" bgcolor="#FFFF00">
			Okul No</td>
			<td class="frmListBaslik" align="center" bgcolor="#FFFF00">Sınıfı</td><td class="frmListBaslik" align="center">
			&nbsp;</td><td class="frmListBaslik" align="center">&nbsp;</td>
		</tr><tr>
			<td align="center">1</td><td align="left">
			ABDULLAH</td><td align="left">ERGİ</td><td align="left">7317</td><td align="left"> 
			9. Sınıf / A Şubesi ( ALANI YOK)</td><td align="left">&nbsp;</td><td align="left">
			&nbsp;</td>
		</tr><tr style="background-color:White;">
			<td align="center">2</td><td align="left">
			AHMET</td><td align="left">GÖKLER</td><td align="left">10225</td><td align="left"> 
			9. Sınıf / A Şubesi ( ALANI YOK)</td><td align="left">&nbsp;</td><td align="left">
			&nbsp;</td>
		</tr><tr>
			<td align="center">3</td><td align="left">
			ALİ</td><td align="left">ALTUN</td><td align="left">1086</td><td align="left"> 
			9. Sınıf / A Şubesi ( ALANI YOK)</td><td align="left">&nbsp;</td><td align="left">
			&nbsp;</td>
		</tr><tr style="background-color:White;">
			<td align="center">4</td><td align="left">
			ALPER</td><td align="left">SARIGÜZEL</td><td align="left">7314</td><td align="left"> 
			9. Sınıf / A Şubesi ( ALANI YOK)</td><td align="left">&nbsp;</td><td align="left">
			&nbsp;</td>
		</tr><tr>
			<td align="center">5</td><td align="left">
			AYCAN</td><td align="left">KARAMAN</td><td align="left">10204</td><td align="left"> 
			9. Sınıf / A Şubesi ( ALANI YOK)</td><td align="left">&nbsp;</td><td align="left">
			&nbsp;</td>
		</tr><tr style="background-color:White;">
			<td align="center">6</td><td align="left">
			BEKİR</td><td align="left">ŞAL</td><td align="left">7301</td><td align="left"> 
			9. Sınıf / A Şubesi ( ALANI YOK)</td><td align="left">&nbsp;</td><td align="left">
			&nbsp;</td>
		</tr><tr>
			<td align="center">7</td><td align="left">
			BERKAY</td><td align="left">TOPAL</td><td align="left">7501</td><td align="left"> 
			9. Sınıf / A Şubesi ( ALANI YOK)</td><td align="left">&nbsp;</td><td align="left">
			&nbsp;</td>
		</tr>
	</tbody></table>

Daha önce burada bulunan örneğin yerine daha otomatik bir örnek:

Bu örnek alan sayısı ve alanları atlama gibi işlerde kolaylık sağlar.

private void Button1_Click(object sender, EventArgs e)
{
    webBrowser1.DocumentCompleted += WebBrowser1_DocumentCompleted;
    webBrowser1.Url = new Uri(@"d:\a.html");
}

private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    // Alan adlarını tanımla.
    string[] Alanlar = new string[] { "Adi", "Soyadi", "OkulNo", "Sinifi" };
    // Hangi hücrelerin kullanacağını belirleyen diziyi tanımla
    // (Duruma göre arada hücre no atlanabilir. İlk hücre numarası 0'dır. Burada birinci hücre atlanıyor.)
    int[] HucreNumaralari = new int[] { 1, 2, 3, 4 };
    //(Alan adları dizisi ile HucreNumaralari dizisinin eleman sayısı aynı olmalı.  HucreNumaralari dizisinin
    // eleman sayısı fazla olursa hata çıkar.

    // Başlık satırı yoksa bunu false yap.
    bool BaslikSatiriVar = true;

    // Bir DataTable oluştur.
    DataTable dt = new DataTable();
    dt.Clear();
    // Alanlar dizisini gezerek her bir eleman için bir alan ekle.
    foreach (string alanAdi in Alanlar)
        dt.Columns.Add(alanAdi);

    // Tablonun id özelliği değerinin tablom olduğunu varsayarsak.

    // Tabloyu al.
    HtmlElement tablo = webBrowser1.Document.GetElementById("dgListe");
    // Satırları satirlar koleksiyonuna yükle.
    HtmlElementCollection satirlar = tablo.GetElementsByTagName("tr");
    HtmlElementCollection hucreler;
    DataRow kayit;
    // Satırları tek tek gez. Başlık satırı varsa 2. satırdan başla.
    for (int i = BaslikSatiriVar ? 1 : 0; i < satirlar.Count; i++)
    {
        // DataTable için yeni bir kayıt oluştur.
        kayit = dt.NewRow();
        // Şimdiki satırın hücrelerini bir koleksiyona al.
        hucreler = satirlar[i].GetElementsByTagName("td");

        // Hücreler içinde HucreNumaralari dizisinin boyu kadar bir gezinti yap.
        for (int j = 0; j < HucreNumaralari.Length; j++)
        {
            // Sıradaki hücre numarasını (indisini) al.
            int hucreNo = HucreNumaralari[j];
            // hucreler koleksiyonundaki indisi hucreNo olan alanın değerini
            // kaydın j. alanına ata.
            kayit[j] = hucreler[hucreNo].InnerText;

            // veya kısaca.
            // kayit[j] = hucreler[HucreNumaralari[j]].InnerText;
        }
        dt.Rows.Add(kayit);

    }
    // Olay dinleyiciyi kaldır.
    webBrowser1.DocumentCompleted -= WebBrowser1_DocumentCompleted;

    // Buradan sonra DataTable ile istediğini yapabilirsin.
    // Örneğin forma bir DataGridView koy. Alttaki satır kayıtları görüntüleyecektir.
    dataGridView1.DataSource = dt;
}

Oluşturulan DataTable verilerini veritabanına kaydetmek isterseniz şuraya bakın.


Cevaplayan: 15.04.17 00:02
cevapsitesi
102,034p 16ü
Cevabı seçen: 14.05.17 19:50
idrisy
79p 11ü
Hocam; öncelikle ilginiz ve yardımlarınız için teşekkür ederim.
 Almak istediğim sayfada 1. sütunda sıra no yerine resimler vardı o sütunu almasın diye. ben onları silmiştim, 
Kodu bu durumda nasıl düzeltebiliriz acaba.

 Bir diğer sorumda kodu webBrowser1_DocumentCompleted e yazarsam ben daha verileri alacağım sayfaya gitmeden
hata veriyor. 
           


→  idrisy 19.04.17 15:47
DocumentCompleted olayını tuş tıklamasına aldım. İşi bitince de olayı siliyor. Bu bahsettiğin hatayı düzeltir.

Eğer doğru anladıysam birinci sütunu atlamak istiyorsun. Onun için hücreleri gezen foreach içinde bir değişiklik yaptım.

Bir de cevap olmayan şeyleri yorum yazarsan iyi olur. Sitenin düzeni bu şekilde. →  cevapsitesi 20.04.17 00:49
Hocam uyarınız için teşekkür ederim.
Sıra No sütununu atlamak istiyorum. Yeni cevabınızı denedim ancak 
kayit[i-1] = hucre.InnerText; satırında hata veriyor.

→  idrisy 20.04.17 17:18
Bir cevap verebilmemiz için hatanın mesajını yazman lazım. →  cevapsitesi 20.04.17 23:53
Hocam; kayit[i-1] = hucre.InnerText; satırında indexOfRangeException hatası veriyor →  idrisy 21.04.17 00:26
HTML tablosundaki hücre sayısını ve DataTable nesnene eklediğin alan sayılarını kontrol et. DataTable alan sayısı tablonun her satırındaki hücre sayısından bir eksik olmalı. →  cevapsitesi 21.04.17 00:59
Hocam; çok teşekkür ederim. →  idrisy 21.04.17 16:40
Hocam; böyle çok daha güzel olmuş.
Ancak web browserden aldığımız verileri datagride almadan direk veritabanına kaydedebilir miyiz acaba?
→  idrisy 22.04.17 23:36
Hocam; ilginiz yardımlarınız için teşekkür ederim. →  idrisy 27.04.17 17:42
Hocam; daha önce de sormuştum siz de cevap yazmıştınız ancak ben onu anlayamadım. Ben access de bunu aşağıdaki gibi çözmüştüm. Bunun gibi bir şey olabilir mi acaba?
.Dim IE As Object
Dim HTML_Body As Object, HTML_Tables As Object, MyTable As Object
Dim HTML_TableRows As Object
Dim x, Y, Z, Guncel, Yeni As Integer
Set IE = Me.WebBrowser1
Set HTML_Body = IE.Document.All
Set HTML_Tables = HTML_Body.tags("Table")
Set MyTable = HTML_Tables(41)
Set HTML_TableRows = MyTable.GetElementsByTagName("td")

For Each MyRow In HTML_TableRows
x = x + 1
Next

Z = (x - 8) / 8

ReDim sorgu(5, Z - 1)
x = 0
Guncel = 0
Yeni = 0
For x = 0 To Z - 1
Y = 1 + (1 * x)
sorgu(0, x) = MyTable.Rows(Y).Cells(1).innertext
sorgu(1, x) = MyTable.Rows(Y).Cells(2).innertext
sorgu(2, x) = MyTable.Rows(Y).Cells(3).innertext
sorgu(3, x) = MyTable.Rows(Y).Cells(4).innertext
Next x
 
Dim rc As DAO.Recordset
Set rc = CurrentDb.OpenRecordset("TabloOgrenciler")
x = 0
For x = 0 To Z - 1
strSQL = "SELECT * FROM TabloOgrenciler "
Set rstkayit = New ADODB.Recordset
rstkayit.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
With rstkayit
kriterim = sorgu(0, x)
.Find "[kriter]=" & "'" & kriterim & "'"
If Not rstkayit.EOF Then

.AddNew
.Fields("adı") = sorgu(0, x)
.Fields("Soyadı") = sorgu(1, x)
.Fields("okulno") = sorgu(2, x)
.Fields("Sınıfı") = sorgu(3, x)

.Update
End If
End With
Next x

şeklinde alabilir miyiz acaba?
→  idrisy 03.05.17 17:42
Böyle de olabilir ama bu çok sayfaya özel bir örnek. Bunu sayfaya göre düzenlemek lazım. Bu da zaman alır ve sonra başka yerde bu kod kullanılamaz. Benim verdiğim örnek otomatik. Sadece tablo adını, alan adlarını ve hangi alanları alacağını belirliyorsun. Eğer Access ile yapıyorsan SqlClient isim alanı yerine Access için kullandığın isim alanlarını ve sınıflarını kullanacaksın. Bence benim verdiğim örneğe biraz çalış. →  cevapsitesi 03.05.17 23:25
Hocam; access de kendime program yapmıştım. Okuldaki öğrenciler çalışırken C#'ı gördüm merak ettim. Belirttiğiniz gibi daha önce yazdığınız kodlarla kayıtlar rahat şekilde alınabiliyor. Ancak ben alırken bazı verileri alıp bazılarını almak istemiyorum. Diyelim ki sütunun birinde öğrencilerin durumunu aktif veya pasif diyor. bende alırken eğer aktif ise alsın değil ise almasın gibi işlemler yaparak almak istiyorum. Eğer yardımcı olabilirseniz sevinirim →  idrisy 04.05.17 00:07
Satırları gezen döngünün içinde şöyle bir değişiklik yapabilirsin.

for (int i = BaslikSatiriVar ? 1 : 0; i < satirlar.Count; i++)
{
    // Şimdiki satırın hücrelerini bir koleksiyona al.
    hucreler = satirlar[i].GetElementsByTagName("td");
    // Burada pasif kayıt bilgisinin yer aldığı hücrenin numarası (burada 0) ve içeriğini kullanırsın (burada Pasif).
    if (hucreler[0].InnerText === "Pasif") continue;
    // DataTable için yeni bir kayıt oluştur.
    kayit = dt.NewRow();
    .
    .
    . →  cevapsitesi 05.05.17 10:37
Hocam; çok teşekkür ederim. →  idrisy 05.05.17 17:52