Merhabalar sayın forum üyeleri konuya başlamadan önce değerli dostum @Memati' başın sağolsun Tanrı cennette kavuştursun...
Kodlara geçmeden önce ekleyeceğimiz kütüphaneler
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;using System.Windows.Forms;using System.Net.Http.Headers;using System.Net;using System.Net.Http;using System.Reflection;GUI Tasarımımıza Ekleyeceğimiz Ögeler
2 adet Textbox biri arama yapmamızı sağlayacak diğeri ise arama sonuçlarının sayısını yazmamızı sağlayacak.
2 adet ListBox birisi URL 'leri ekleyecek diğeri SQL kontrolü yapacak olan verileri listeleyecek.
3 adet RichTextbox birisi SQL hatalarını yazacağımız kısım diğeri açılan URL 'lerin içeriklerinin yansıyacağı kısım sonuncusu ise arama kısmında gelen JSON verisini barındıracak olan...
1 adet BackGroundWorker URL 'leri ListBox üzerinde tek tek açıp RichTextBox içerisine içeriklerini indirecek & kontrol edecek.
7 adet Buton bunlar sırası ile, + - butonu arama sonucu sayımızı arttıracak veya azaltacak butonlar, Ara butonumuz API tetikleyen kodu barındıracak, Aktar butonumuz karman çorman JSON verisini Regex kullanarak ListBox1 içerisinde düzenli hale getiren kodu barındıracak, Başla butonumuz SQL taraması işlemini başlatacak olan kodu barındırıyor, Kaydet sonuçları metin belgesine aktaracak olan kodumuzu barındırıyor, Yeni yeni bir arama yapmamızı sağlayacak olan kodu barındıracak olan butonumuz
Kodlara geçelim.
BackGroundWorker nesnemizi şekillendirelim
C#:
private void InitializeBackgroundWorker1()
{
backgroundWorker1 = new BackgroundWorker();
backgroundWorker1.DoWork += backgroundWorker1_DoWork;
backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged;
backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
}
Ardından Load olayına aşağıdaki kodu girerek BackGroundWorker nesnemizin şekillendirme işlemini tanıtalım
C#:
InitializeBackgroundWorker1();
BackGroundWorker aşağıdaki kodda çalışmaya başlıyor ve ListBox ögesi içerisine yansıtılan URL 'leri tek tek seçerek aşağı iniyor.
C#:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
try
{
for (int i = 0; i < listBox1.Items.Count; i++)
{
if (backgroundWorker1.CancellationPending)
{
e.Cancel = true;
return;
}
backgroundWorker1.ReportProgress(i, i);
System.Threading.Thread.Sleep(875); // Her öğe için 875 ms bekle
}
}
catch (Exception ex)
{
e.Result = ex; // Hata bilgisini RunWorkerCompleted olayına geçir
}
}
BackGroundWorker aşağıdaki kodda ListBox1 ögesinde olan URL 'leri seçerken hepsini açıyor & RichTextbox2 ögesine açılan web sayfası içeriklerini yansıtıyor.
C#:
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
try
{
using (WebClient client = new WebClient())
{
int index = (int)e.UserState;
listBox1.SelectedIndex = index;
listBox1.TopIndex = index;
if (index >= 0 && index < listBox1.Items.Count)
{
string url = listBox1.Items[index].ToString();
string result = client.DownloadString(url);
richTextBox2.Text = result;
SQLkelimeAra();
}
}
}
catch (WebException ex)
{
MessageBox.Show($"Hata oluştu: {ex.Message}", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
BackGroundWorker çalışırken veya iş bittikten sonra oluşabilecek hataları işletim sistemimiz karışmasın diye forma verdiriyoruz.
C#:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("İşlem iptal edildi.");
}
else if (e.Error != null)
{
MessageBox.Show("Bir hata oluştu: " + e.Error.Message);
}
else if (e.Result is Exception ex)
{
MessageBox.Show("Bir hata oluştu: " + ex.Message);
}
else
{
MessageBox.Show("İşlem Tamanlandı!", Dns.GetHostName(), MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
Şimdi gelelim RapidAPI kodumuza... Kodumuz Asenkron yapısını kullanmış & C# içerisinde asenkron yapısı kullanırken GUI nesnelerine işlem esnasında veya sonunda rapor verme konusunda sıkıntılar yaşatmakta idi bunu burada bu kod ile çözmüş bulunmaktayız. RichTextBox1 ögemizin içerisine JSON verisini asenkron kullanarak yansıtıyoruz.
C#:
private async Task DownloadAsync()
{
var client = new HttpClient();
var maxResults = textBox2.Text;
var searchText = textBox1.Text;
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://google-api31.p.rapidapi.com/websearch"),
Headers =
{
{ "x-rapidapi-key", "KEY" },
{ "x-rapidapi-host", "google-api31.p.rapidapi.com" },
},
Content = new StringContent($"{{\"text\":\"{searchText}\",\"safesearch\":\"off\",\"timelimit\":\"\",\"region\":\"wt-wt\",\"max_results\":{maxResults}}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
// UI thread üzerinde RichTextBox güncelleniyor
Invoke(new Action(() =>
{
richTextBox1.Text = body;
}));
}
}
Not : Şimdi burada RapidAPI 'ye kaydolduktan sonra API kodlarını denemek için İngilizce terim olan Example yani örnek kısmını görüp hemen C# açıp denemeye kalkmayın yoksa hata verir. API 'nizin çalışır olması için ilgili API 'ye aşağıda göstereceğim yöntem ile üye olun sonra çalışmaya başlar. Yukarıda biz GoogleSearchAPI kullandık ama benzer bir yöntem olan Covid-19 Raporunu gösteren bir API 'yi aktifleştirelim.
Arama kısmına covid yazdım. Burada dikkat edin Updated yani güncelleme kısmı 3 ay geçmiş üzerinden. Siz bu tarz API 'leri ararken sahibinin güncelleme aralığına bakın yoksa API yine hata verebilir. Neyse ilk çıkana tıkladım.
Konumuza devam edelim...
Ara butonu kodları
C#:
Task.Run(() => DownloadAsync());
Aktar butonu kodları
Kod:
string text = richTextBox1.Text;
Regex regex = new Regex("\"href\":\"(.*?)\"");
MatchCollection matches = regex.Matches(text);
foreach (Match match in matches)
{
listBox1.Items.Add(match.Groups[1].Value + Environment.NewLine);
}
Başla butonu kodları
C#:
if (!backgroundWorker1.IsBusy)
{
backgroundWorker1.RunWorkerAsync();
}
+ - Butonları kodları
Arttırma kodu
C#:
textBox2.Text = (int.Parse(textBox2.Text) + 1).ToString();
Eksiltme kodu
C#:
textBox2.Text = (int.Parse(textBox2.Text) - 1).ToString();
Yeni butonu kodları
C#:
listBox1.Items.Clear();
listBox2.Items.Clear();
richTextBox2.Text = "";
richTextBox1.Text = "";
Kaydet butonu kodu
C#:
const string sPath = "save.txt";
System.IO.StreamWriter SaveFile = new System.IO.StreamWriter(sPath);
SaveFile.WriteLine(listBox2.Items);
SaveFile.ToString();
SaveFile.Close();
Şimdi ise bir void oluşturup adını SQLkelimeAra yapıyoruz burada RichTextbox3 içerisine yazmış olduğunuz SQL hataları aranacak bulunursa Bulundu olarak eklenecek bulamaz ise Bulunamadı olarak ekleyecek.
C#:
void SQLkelimeAra()
{
string kelime = richTextBox2.Text;
string[] arananKelimeler = richTextBox3.Text.Split(new[] { ' ', ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
bool bulundu = arananKelimeler.Any(k => kelime.IndexOf(k, StringComparison.OrdinalIgnoreCase) >= 0);
if (bulundu)
{
listBox2.Items.Add("Bulundu : "+listBox1.SelectedItem);
}
else
{
listBox2.Items.Add("Bulunamadı : "+listBox1.SelectedItem);
}
}
Hz. Yusuf Üzerinde Bazı Terimler Yazarak Bir Arama Yapmıştım Sonuçlarım
- S0N -
- S0N -
Son düzenleme:



