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

WebBrowser içindeki sayfada bulunan tablodaki verileri datatable a çekmek

http://yazilim.cevapsitesi.com/Sorular/1078/webbrowser-icindeki-sayfada-bulunan-tablodaki-verileri-veritabanina-kaydetmek 
Burdaki soruyu inceledim çokçada uğraşmama rağmen bir türlü çözüm bulamadım. öncelikle çekmek istediğim tablonun id ve name değerleri sürekli değişiyor. Çünkü tablo bir sorgulamanın sonucunda div içinde açılıyor. Referans olarak bulabildiğim tek değer tablonun html element collectiondaki sırası. Bu hiç değişmiyor. 
System.Windows.Forms.HtmlDocument doc = browser.Document;
            HtmlElementCollection elems = doc.GetElementsByTagName("table");
            HtmlElement a = elems[5];
a elementinin düzeltilmiş hali
...<TBODY>\r\n
	<TR>\r\n
1		<TH class=bslkK><INPUT onclick=\"selectAll(this); beyannameIs
lemButonlariniDuzenle(this.form);\" id=hepsi title=\"Bu sayfadaki tüm beyannameleri seç\" type=checkbox name=hepsi></TH>\r\n
		<TH class=bslkK>Beyanname Türü</TH>\r\n
		<TH class=bslkK>TC Kimlik Numarası / Vergi Kimlik Numarası</TH>\r\n
		<TH class=bslkK>Ad Soyad/Unvan(*)</TH>\r\n
		<TH class=bslkK>Vergi Dairesi / Malmüdürlüğü</TH>\r\n
		<TH class=bslkK>Vergilendirme Dönemi</TH>\r\n
		<TH class=bslkK>Şube No</TH>\r\n
		<TH class=bslkK>Durumu</TH>\r\n
1		<TH class=bslkK align=left>\r\n
			<TABLE>\r\n
				<TBODY>\r\n
					<TR>\r\n
						<TD style=\"WIDTH: 17px\" align=center><IMG src=\"https://ebeyanname.gib.gov.tr/images/ico_msg.gif\"></TD>\r\n
						<TD></TD>\r\n
						<TD></TD>\r\n
						<TD></TD>
					</TR>
				</TBODY>
			</TABLE>
		</TH>
	</TR>\r\n
		<SCRIPT type=text/javascript>var beyannameTipleri = [];</SCRIPT>\r\n\r\n
		<SCRIPT>beyannameTipleri['pty'] = 'KDV1';\n\n</SCRIPT>\r\n\r\n
	<TR id=row1pty title=\"DBS_12345678_1_4007   26.07.2019 - 14:58:45\" class=blAG>\r\n
		<TD id=checkboxTDpty align=center></TD>\r\n
		<TD>KDV1</TD>\r\n
		<TD align=left>12345678912</TD>\r\n
		<TD>name surname</TD>\r\n
		<TD align=left>suranın dairesi</TD>\r\n
		<TD align=center>06/2019-06/2019</TD>\r\n
		<TD align=center>Merkez</TD>\r\n
		<TD id=durumTDpty><IMG src=\"https://ebeyanname.gib.gov.tr/images/ok.gif\">&nbsp;Onaylandı</TD>\r\n
		<TD>\r\n
			<TABLE>\r\n
				<TBODY>\r\n
					<TR>\r\n
						<TD style=\"WIDTH: 17px\" align=center></TD>\r\n
						<TD style=\"WIDTH: 17px\" align=center><IMG onclick=\"beyannameGoruntule('pty',false,false)\" title=\"Beyannameyi PDF Formatında görüntülemek için tıklayınız.\" style=\"CURSOR: pointer\" src=\"https://ebeyanname.gib.gov.tr/images/pdf_b.gif\"> </TD>\r\n
						<TD id=thkPDFpty style=\"WIDTH: 17px\" align=center><IMG onclick=\"tahakkukGoruntule('pty','r81',false,false)\" title=\"Tahakkuku PDF Formatında görüntülemek için tıklayınız.\" style=\"CURSOR: pointer\" src=\"https://ebeyanname.gib.gov.tr/images/pdf_t.gif\"> </TD>\r\n
						<TD id=pty style=\"WIDTH: 17px\" align=center></TD>
					</TR>
				</TBODY>
			</TABLE>
		</TD>
	</TR>\r\n
</TBODY>
ben bu tabloyu datatableye ordanda datagridview e almak istiyorum.
...            DataTable dt = new DataTable();
            dt.Clear();
            foreach (HtmlElement coll in a.GetElementsByTagName(tagName: "th"))
            {
                try
                {
                    dt.Columns.Add(coll.InnerText);
                }
                catch
                {
                }
            }
burdan columns ları aldım başında ve sonunda 1. kod bloğunda 1 ile işaretlediğim yerleri boş sütün olarak ekliyor.
ancak satırları eklemeye kalktığımda "tr" ile ayırdığım için  her satırın son hücresinin içindeki ayrı tablo yüzünden hata alıyorum.
...            int[] Hucrn = new int[] {1, 2, 3, 4, 5, 6, 7, 8};
            HtmlElementCollection satirlar = a.GetElementsByTagName("tr");
            HtmlElementCollection hucreler;
            DataRow kayit;
            for (int i = 2; i < satirlar.Count; i++)
            {
                kayit = dt.NewRow();
                hucreler = satirlar[i].GetElementsByTagName("td");
                for (int j = 0; j < Hucrn.Length; j++)
                {
                    int hucreNo = Hucrn[j];
                    kayit[j] = hucreler[hucreNo].InnerText;
                }
                dt.Rows.Add(kayit);
                dataGridView1.DataSource = dt;
            }
İç içe geçmiş olan tablodan verileri nasıl çekebilirim. 
Yardımlarınız için şimdiden teşekkür ederim.

1 Cevap

0
HtmlElementCollection satirlar = a.GetElementsByTagName("tr");
yerine
HtmlElementCollection satirlar = a.GetElementsByTagName("tbody")[0].Children;
kullanıp, döngü içinde aşağıdaki gibi TR olmayan etiketleri atlayabilirsin.

Children'in çocuk etiketleri vermesi lazım. Daha alt seviyelerdeki etiketleri değil.

            int[] Hucrn = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };
            HtmlElementCollection satirlar = a.GetElementsByTagName("tbody")[0].Children;
            HtmlElementCollection hucreler;
            DataRow kayit;
            for (int i = 2; i < satirlar.Count; i++)
            {
                if (satirlar[i].TagName.ToLower() != "tr") continue;
                kayit = dt.NewRow();
                hucreler = satirlar[i].GetElementsByTagName("td");
                for (int j = 0; j < Hucrn.Length; j++)
                {
                    int hucreNo = Hucrn[j];
                    kayit[j] = hucreler[hucreNo].InnerText;
                }
                dt.Rows.Add(kayit);
            }
            dataGridView1.DataSource = dt;


Cevaplayan: 21.08.19 18:12
cevapsitesi
102,034p 16ü