Çözüldü C# Richtextbox'da method ile her satırın sonundan ve başından karakter silme

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

sauranex

Hectopat
Katılım
24 Eylül 2020
Mesajlar
643
Makaleler
1
Çözümler
3
Öncelikle merhaba, elimde bir richtextbox var ve bunda 5000 küsür satır var, satır başından "-2", satır sonundan iste "-5" karakter silmek istiyorum tabi bu silinen karakter sayısı değişiklik gösteriyor. Projede kullandığım böyle bir kod var fakat bu kod bloğunu her işlem yaptığımda yazmam lazım bunun yerine "private void" tarzı bir method kullanmak istiyorum, yani methodu çektiğimde sayı belirticem ve ona göre işlem yapıcak. Satır sayısı 5000 ile sınırlı kalmayabilir bu işlem 1.000.000 sayıya kadar çıkabilir bu yüzden StringBuilder'ı BackgroundWorker içinde kullanıyorum. Kısacası istediğim kod, bir method çağırarak satır sonundan ve başından silme işlemi yapacak fakat methodu satır sonu veya satır başı işlemine özel olarak almak ve sayı belirtmek istiyorum. Hobi amaçlı yazılım geliştirdiğim için fazla bilmiyorum, kullandığım kod bloğunu aşağıya bırakıyorum.
[CODE lang="csharp" title="Richtextbox her satır başından 8 karakter silen kod bloğu"] StringBuilder sbdnsmasqfirst = new StringBuilder();
foreach (string s in rtbList.Lines)
{
if (s.Length > 0)
{
sbdnsmasqfirst.AppendLine(s.Substring(8));
}
}
rtbList.Text = sbdnsmasqfirst.ToString();[/CODE]

[CODE lang="csharp" title="Richtextbox her satır sonundan 3 karakter silen kod bloğu"] StringBuilder sbdnsmasqlast = new StringBuilder();
foreach (string s in rtbList.Lines)
{
if (s.Length > 0)
{
sbdnsmasqlast.AppendLine(s.Substring(0, s.Length - 3));
}
}
rtbList.Text = sbdnsmasqlast.ToString();[/CODE]
 
Çözüm
Bunu dener misin?
C#:
private void subs(RichTextBox obj, int start, int end) {
    StringBuilder sbdnsmasqlast = new StringBuilder();
    foreach(string s in rtbList.Lines) {
        if(s.Length > 0) {
            sbdnsmasqlast.AppendLine(end == 0 ? s.Substring(start) : s.Substring(start, s.Length - start - end));
        }
    }
    rtbList.Text = sbdnsmasqlast.ToString();
}
BackgroundWorker yapısını tam olarak bilmiyorum ama her işlem için ayrı bir BackgroundWorker tanımlıyorsan constructorına parametre olarak RichTextBox, başlangıç ve bitiş noktalarını verirsen BackgroundWorker içinde bu metodu çağırıp istediğini yapabilirsin diye düşünüyorum:
Kod:
private void subs(RichTextBox obj, int start, int end) {
    StringBuilder sbdnsmasqlast = new StringBuilder();
    foreach(string s in rtbList.Lines) {
        if(s.Length > 0) {
            sbdnsmasqlast.AppendLine(s.Substring(start, s.Length - end));
        }
    }
    rtbList.Text = sbdnsmasqlast.ToString();
}
 
@bertek41 Verdiğiniz methodu aşağıdaki gibi nasıl uygulayabilirim, daha önce fazla method kullanmadım, aşağıdaki gibi olmasını istiyorum. Eğer açıklayıcı değilse daha detaylı anlatabilirim.
C#:
if (cbmasq.Checked)
 {               
//rtbList.Text = tüm satır başından silecek methodu çekerek sayı belirt ve sil
 }
else if (cbcloaq.Checked)
 {
 //rtbList.Text = tüm satır başından silecek methodu çekerek sayı belirt ve sil
 //rtbList.Text = tüm satır sonundan silecek methodu çekerek sayı belirt ve sil
 }
 
Böyle kullanılabilir ama eğer mevcut kod bloğu workerda değilse bu işlemler main thread'de gerçekleşecektir.
C#:
if(cbmasq.Checked) {
    subs(rtbList, satırbaşındansilinecekmiktar, 0);
} else if(cbcloaq.Checked) {
    subs(rtbList, satırbaşındansilinecekmiktar, satırsonundansilinecekmiktar);
}

Ayrıca kodunuzda "naming conventions" konusuna özen göstermeniz yararınıza olacaktır.
 
@bertek41
Ana projeyi bozmamak için 1 buton ve 1 rtb ile denedim fakat aşağıdaki hatayı veriyor.
Ekran Görüntüsü (7).png
 
@bertek41
Ana projeyi bozmamak için 1 buton ve 1 rtb ile denedim fakat aşağıdaki hatayı veriyor.
Eki Görüntüle 1117882
Benim hatam bunu deneyin:
C#:
private void subs(RichTextBox obj, int start, int end) {
    StringBuilder sbdnsmasqlast = new StringBuilder();
    foreach(string s in rtbList.Lines) {
        if(s.Length > 0) {
            sbdnsmasqlast.AppendLine(end == 0 ? s.Substring(start) : s.Substring(start, s.Length - end));
        }
    }
    rtbList.Text = sbdnsmasqlast.ToString();
}
 
@bertek41
Hocam sadece satır başından silen kod çalışıyor, satır sonu ve satır başından silen kod subs(rtbList, 3, 2); aynı hatayı veriyor oda düzelirse muhteşem olucak, yardımınız için çok teşekkürler. Ek olarak methodu backgroundworker içine alabilecek şekilde düzeltebilirmiyiz, dışarıdan erişince program donma yapıyor. Aşağıdaki şekilde;
[CODE lang="csharp" title="Bu mantıkta çalışacak şekilde methodu içe alabilirmiyiz"]private void bgwCreate_DoWork(object sender, DoWorkEventArgs e)
{

StringBuilder sbdnsmasqlast = new StringBuilder();
foreach (string s in rtbList.Lines)
{
if (s.Length > 0)
{
sbdnsmasqlast.AppendLine(end == 0 ? s.Substring(start) : s.Substring(start, s.Length - end));
}
}
rtbList.Text = sbdnsmasqlast.ToString();

if (cb123.Checked)
{
subs(rtbList, 5, 0); //satır başı silen kod
}
else if (cbasd.Checked)
{
subs(rtbList, 3, 2); //satır başı silen kod
}
}[/CODE]
 
Son düzenleme:
Hata end parametresi 0'dan küçük döndüğü için hata oluyor sanırım.
C#:
private void subs(RichTextBox obj, int start, int end) {
    StringBuilder sbdnsmasqlast = new StringBuilder();
    foreach(string s in rtbList.Lines) {
        if(s.Length > 0) {
            sbdnsmasqlast.AppendLine(end == 0 ? s.Substring(start) : s.Substring(start, s.Length - end >= 0 ? s.Length - end : 0));
        }
    }
    rtbList.Text = sbdnsmasqlast.ToString();
}
BackgroundWorker kısmı için start ve end değişkenlerini dediğim gibi constructora parametre olarak verebilirsiniz veya fielda koyup ordan erişebilirsiniz.
 

Yeni konular

Geri
Yukarı