C# combobox check box filtrelemesi olmuyor

farukk1661

Picopat
Katılım
8 Aralık 2024
Mesajlar
136
Çözümler
2
Daha fazla  
Sistem Özellikleri
Anakart : Gigabyte B450-M S2H
İşlemci: AMD Ryzen 5 5500
RAM : Corsair vengeance RGB pro16GB 3600Mhz
Ekran Kartı : Sapphire nitro plus RX 6600XT
Cinsiyet
Erkek
Meslek
İşsiz
Cümleten selamünaleyküm.
Kendim bir Minecraft Launcher kodluyorum, her şey tamam, bitti neredeyse fakat şu sorunu aşamıyorum, combobox'da bütün sürümler gözüküyor, ben bunu filtreleyip sadece release sürümleri göster olarak da yapabiliyorum ama bunu checkbox aracılığıyla yapmaya çalıştığım zaman olmuyor, checklediğim zaman filtre çalışsın istiyorum.

Kod:
private async void listVersions()
 {
 var path = new MinecraftPath(Environment.GetEnvironmentVariable("APPDATA") + "/.fm_launcher");
 var launcher = new MinecraftLauncher(path);
 var versions = await launcher.GetAllVersionsAsync();
 foreach (var version in versions)
 {

 if (checkRelease.Checked)

 {

 if (version.Type == "release")
 {
 comboVersions.Items.Add(version.Name);
 }
 }
 else.
 {

 comboVersions.Items.Add(version.Name);
 }
 }
 if (comboVersions.Items.Count > 0)
 {
 comboVersions.SelectedIndex = 0;
 }

 }
 
listVersions'u kim cagiriyor? checkbox check eventine bi fonksiyon cagrisi verdin mi combobox'i yeniden doldurmasi icin?
 
Listversions'u kim cagiriyor? Checkbox check eventine bir fonksiyon cagrisi verdin mi Combobox'i yeniden doldurmasi icin?

Nasıl yapacağımı açıklar mısın?
 
C#:
// Constructor'da InitializeComponent'in altina;
InitializeComponent();
checkRelease.CheckedChanged += (s, e) => listVersions();

Yukaridaki gibi kullanabilirsin. Event handlerlari ogren; CheckBox.CheckedChanged Event (System.Windows.Forms)

Ama yerinde olsam senin listVersions fonksiyonunu iki parcaya ayiririm ben. Versiyonlari getiren parca cachelenmeli. Her cagrildiginda listeyi yenilememeli force renew istenmedigi muddetce. Durduk yere bekleme suresini uzatir listenin acilis kapanisinda vs.

var versions = await launcher.GetAllVersionsAsync();
Bu kismi class member olarak tut. Gerektiginde yeniden assign et yada refill yap vs. ComboBox'i da bundan doldur her seferinde bunu yeniden yeniden cagirmak yerine.
 
var versions = await launcher.GetAllVersionsAsync();
Bu kısmı class member olarak tut. Gerektiginde yeniden assign et ya da refill yap vs. combobox'i da bundan doldur her seferinde bunu yeniden yeniden cagirmak yerine.

Bu dediğin kısmı anlayamadım.
 
Son düzenleme:
Versions adlı değişken şu an bir fonksiyonun içinde yaşıyor değil mi? Bunu fonksiyon yerine sınıfın bir parçası yap diyorum.

Sınıfta değişken olsun diyorum.

Yaptım. Checklediğim zaman release sürümler beta sürümlerin üstüne ekleniyor neden?

İtems clear yaptırıp tekrar yazdırdıgımda yalnızca 1.0 sürümü geliyor.
 
Yaptım. Checklediğim zaman release sürümler beta sürümlerin üstüne ekleniyor neden?

İtems clear yaptırıp tekrar yazdırdıgımda yalnızca 1.0 sürümü geliyor.
Clear'i her itemdan once mi yapiyorsun?

Soyle olmali asagi yukari;
C#:
checkRelease.CheckedEvent += (sender, eventArgs) => {
    ComboBox.Items.Clear();
    if (checkRelease.Checked) {
        ComboBox.Items.AddRange(
            versions
            .Where(version => "release".Equals(version.Type))
            .Select(version => version.Name)
            .ToArray()// Fluent API icin Linq gerekiyor.
        );
    } else {
        ComboBox.Items.AddRange(versions.Select(version => version.Name).ToArray());
    }
}

Linq Fluent API'sini aciklayacak olursam; versions adli listede once type release olanlari getiriyoruz (filtreleme yapiyoruz), ardindan version.Name'leri seciyoruz bu degisken icerisinde, sonrasinda array yapip range olarak ComboBox'a ekliyoruz. Oncesinde clear cagirdigimiz icinde ComboBox'ta sadece release yada tum surumler oluyor.
 
Clear'i her itemdan once mi yapiyorsun?

Soyle olmali asagi yukari;
C#:
checkRelease.CheckedEvent += (sender, eventArgs) => {
 ComboBox.Items.Clear();
 if (checkRelease.Checked) {
 ComboBox.Items.AddRange(
 versions.
 .Where(version => "release".Equals(version.Type))
 .Select(version => version.Name)
 .ToArray()// Fluent API icin Linq gerekiyor.
 );
 } else {
 ComboBox.Items.AddRange(versions.Select(version => version.Name).ToArray());
 }
}

Linq fluent API'sini aciklayacak olursam; versions adli listede once type release olanlari getiriyoruz (filtreleme yapiyoruz), ardindan version. Name'leri seciyoruz bu degisken icerisinde, sonrasinda array yapip range olarak Combobox'a ekliyoruz. Oncesinde clear cagirdigimiz icinde Combobox'ta sadece release ya da tum surumler oluyor.

Hata alıyorum acaba bu kısmı nasıl class yapıcam

C#:
            var versions = await launcher.GetAllVersionsAsync();

Class yapamadım mı nasıl yapacağım teyit etmiş olayım.
 
Hata alıyorum acaba bu kısmı nasıl class yapıcam

C#:
            var versions = await launcher.GetAllVersionsAsync();

Class yapamadım mı nasıl yapacağım teyit etmiş olayım.
Onu class yapmayacaksin. Suan kullandigin formun adi LauncherForm olsun;
C#:
class LauncherForm : Form {
    List<MinecraftVersion> versions; // version sinifinin adini bilmedigimden salladim bi sey
   
    public async void listVersions() {
        // onceki kisimlar ayni
        versions = await launcher.GetAllVersionsAsync();
        // sonraki kisimlar ayni
    }
   
    public LauncherForm() {
        InitializeComponent();
        checkRelease.CheckedChanged += (sender, eventArgs) => {
            ComboBox.Items.Clear();
            if (checkRelease.Checked) {
                ComboBox.Items.AddRange(
                    versions
                    .Where(version => "release".Equals(version.Type))
                    .Select(version => version.Name)
                    .ToArray() // Fluent API icin Linq gerekiyor.
                );
            } else {
                ComboBox.Items.AddRange(versions.Select(version => version.Name).ToArray());
            }
        }
    }
}

En tepede bi degisken olusturdum. Bu class'in memberi iste.
 
Son düzenleyen: Moderatör:

Yeni konular

Geri
Yukarı