.NET | comboBox ve textBox verilerini/bilgilerini klasörlerde bulup dgv'de açmak

Başlatan luintudo, 22 Ağustos 2022, 11:29:27

luintudo

Herkese iyi haftalar dilerim, Visual Studio C#'a yeni başlamış birisi olarak; Resimde göründüğü gibi bir parametre uygulaması geliştiriyorum, parametre isimli bir klasör oluşturdum ve içinde 4 adet klasör(makine no), her klasörün içinde ise excel dosyaları(ürün kodu) mevcut. uygulamanın amacı ise comboBox'da seçilen makine no ile aynı isimde olan klasörü seçecek daha sonra ise textBox'da kullanıcının yazdığı isimle kayıtlı olan excel dosyasını dataGridView sekmesinde gösterecek, daha önce dosyayı manuel olarak seçiyordum ancak yaklaşık 300'e yakın excel dosyası olacağı için çok fazla karmaşıklık oluyor, yukarıda istediğim gibi bir modül kurulabilir mi? kurulabilirse nasıl/hangi yöntemlerle yapabilirim?


Resimde gördüğünüz uygulamanın şu anlık kodları


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ExcelApp = Microsoft.Office.Interop.Excel;



namespace homework
{
    
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            
          

        }
        public DataTable ToDataTable(ExcelApp.Range range, int rows, int cols)
        {
            DataTable table = new DataTable();
            for (int i = 1; i <= rows; i++)
            {
                if (i == 1)
                { // ilk satırı Sutun Adları olarak kullanıldığından
                  // bunları Sutün Adları Olarak Kaydediyoruz.
                    for (int j = 1; j <= cols; j++)
                    {
                        //Sütunların içeriği boş mu kontrolü yapılmaktadır.
                        if (range.Cells[i, j] != null && range.Cells[i, j].Value2 != null)
                            table.Columns.Add(range.Cells[i, j].Value2.ToString());
                        else //Boş olduğunda Kaçınsı Sutünsa Adı veriliyor.
                            table.Columns.Add(j.ToString() + ".Sütun");
                    }
                    continue;
                }
                //Yukarıda Sütunlar eklendi
                // onun şemasına göre yeni bir satır oluşturuyoruz. 
                //Okunan verileri yan yana sıralamak için
                var yeniSatir = table.NewRow();
                for (int j = 1; j <= cols; j++)
                {
                    //Sütunların içeriği boş mu kontrolü yapılmaktadır.
                    if (range.Cells[i, j] != null && range.Cells[i, j].Value2 != null)
                        yeniSatir[j - 1] = range.Cells[i, j].Value2.ToString();
                    else // İçeriği boş hücrede hata vermesini önlemek için
                        yeniSatir[j - 1] = String.Empty;
                }
                table.Rows.Add(yeniSatir);
            }
            return table;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}




Epsilon

Veritabanı yapısı hatalı görülüyor.Bu tür bir konuyu excel çok rahat  çözer ancak
daha detaylı anlatmalısınız.Örneğin bunlar, farklı model güçlerde onlarca motor modeli gibi ve herbir model motor yüzlerce malzemeden mi oluşuyor ?
Ayrıca excel kendi içinde başka excel dosyasını da kolayca açar.
Excelin neler yapabildiğine dair basit bir örnek video
*Örnekte herhangi bir alanda(Field) herhangi bir karakteri arayıp gösteriyor
(12:50 de programı test ediyor)


tunayk

Bu tür işler için Excell kullanılabilir olsa da, safkan veritabanı uygulaması Access daha iyi bir çözüm olabilir.

@Epsilon 'un dediği gibi önce veritabanı yapısının düzeltilmesinde fayda var. Yapı düzgün olursa bir sürü dosya ile boğuşmana da gerek kalmaz program yazmana da

Epsilon

Alıntı yapılan: tunayk - 23 Ağustos 2022, 21:26:50Bu tür işler için Excell kullanılabilir olsa da, safkan veritabanı uygulaması Access daha iyi bir çözüm olabilir.

Haklısınız ancak excelin yeni versiyonlarında kayıt ekleme sınırı çok artırıldı

Alıntı
"Excel'de en çok merak edilen konuların başında gelen Excel'de kaç hücre olduğudur. Excel'deki Hücre sayısı, satır sayısı, sütun sayısı kaçtır. Excel'de sütun harfleri A ile başlar ve XFD ile biter ki bu da 16.384 adet sütun demektir. Satır numaralarıda 1'den başlar ve 1.048.576 'da biter"

Yani 1milyondan fazla kayıt anlamına geliyor .Tabi bu kadar sütün kullanmak kesinlikle uygulamayı hantallaştırır.Anahtar fieldları çok iyi planlamak ve düzgün kullanmak gerekir.

luintudo

Veritabanı yapısını düzenlenmesi elbette daha kolay ancak işletme benden bunu düzenlemekten ziyade bu bilgileri database'e aktarmam gerektiğinde ısrar ediyor ben şöyle bir çözüm buldum, resim-1 işletmenin kendi kullandığı parametre formu benden bu formu ikinci yaptığım forma otomatik olarak çevirecek bir uygulama isteniyor ancak bu kadar uğraşa gerek var mı? Diye düşünerekten ikinci formu kendim excelden düzenleyerek yaptım ve kolon altındaki sayısal verileri silerek işletmeye yolladım, onların bu kısımları doldurup geri göndermesi benim o excel dosyalarını database dosyasına veya direkt ssms ile bağlantı kurup oraya aktarmama daha çok kolaylık sağlayabileceğini düşündüm, fikirleriniz nelerdir bu konuda?





Epsilon

Alıntı yapılan: luintudo - 24 Ağustos 2022, 09:31:41Veritabanı yapısını düzenlenmesi elbette daha kolay

Eğer yanlış veribabanı yapısı oluşturulmuşsa,fazla birşey yapılamaz.Programın baştan yazılması gerekir (Genelde de böyle olur)
Sorunun çözümü için konuyu izah edin.
Örneğin:
Bir ... üreten firma var.Bu firma bu ürünleri üretirken(atıyorum) 128 farklı kalıp kullanıyor.
Firmanın zorlandığı konu.... .Herbir ürüne ait ... bilgileri mevcut ancak ..... şu bilgiler değişiyor gibi

Yoksa ekran görüntülerinden konu anlaşılmıyor.



luintudo

Alıntı yapılan: Epsilon - 24 Ağustos 2022, 10:58:18Eğer yanlış veribabanı yapısı oluşturulmuşsa,fazla birşey yapılamaz.Programın baştan yazılması gerekir (Genelde de böyle olur)
Sorunun çözümü için konuyu izah edin.
Örneğin:
Bir ... üreten firma var.Bu firma bu ürünleri üretirken(atıyorum) 128 farklı kalıp kullanıyor.
Firmanın zorlandığı konu.... .Herbir ürüne ait ... bilgileri mevcut ancak ..... şu bilgiler değişiyor gibi

Yoksa ekran görüntülerinden konu anlaşılmıyor.

Öncelikle özür dileyerek detaylı şekilde izah etmek gerekirse; Kauçuk ve Plastik üreten bir firma kauçukları birbirine bağlamak için kullandıkları 4 adet plastik enjeksiyon makinası için parametre formlarını bana gönderdi bu formlarda her makinanın arayüzüne özel dizayn edilmiş bir tablo mevcut yani 4 adet ayrı excel tablosu var, işletme ürünlere özel bu 4 adet tabloyu doldurup ürün koduyla aynı isimde olmak üzere farklı kaydetmiş, benden bu formların bilgilerini elde olan ürünler için ve her yeni ürün eklendiğinde database'e kaydetmek üzere bir uygulama geliştirmemi istediler, uygulama orada yer alan her excel dosyası için kolon ve satırların denk geldiği verileri (örneğin: mengene açma satırının mesafe sütunundaki 60 mm değeri, uygulama sayesinde database tablosuna gidip mesafe sütunundaki mengene açma satırına aynı değeri görüp yazmalı ancak bunu yapmak çok zor ve zaten bende öyle bir yazılım bilgisi bende de yok yeni başladım) aynı şekilde database tabanına aktarmamı istedi ancak tablolar genellikle "Merge & Center" odaklı ve makine arayüzüne özel tasarlandığı için sütunları databse table'a aktarınca tutarsızlaşıyor, cvs formatına çevirip SQLite üzerinden açmak istediğimde de kullandıkları Türkce karakterler ve simgeler yüzünden hiç okunmaz hale geliyor ve teker teker onları düzenlemek gerekiyor, ben onlardan örnek olarak düzenlediğim bir form (bir önceki örnekte 2. resim) hazırladım yapımı kolay sadece Excel'de bulunan Format Painter kullanarak düzenleyip bana daha uygun bir şekilde atmalarını istedim ama işletme hala bir önceki projede ısrar etsede onları ikna etmeyi başardım, aslında sorunu çözdüm sizden ufak bir konuda yardım istemem gerekecek. sadece kaydetme butonu kısmı kaldı ben bu dataGridView'de görünen o tabloyu ".db" olarak istediğim path'e(dosya yoluna) kaydedecek ve textBox'da yazan isimle kaydetmem gerekiyor bunu arraylist ve for döngüsü kullanarak yapmamın bir yolu varsa hangi kodları kullanmalıyım? Şimdi sizlere kullandığım kodları atacağım; son butonu tekrardan düzenlenip yine tekrar atacağım olur da ileride bu sorunu veya bu soruna benzer bir sorun yaşayan/yaşayabilecek arkadaşlar olursa diye.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using ExcelApp = Microsoft.Office.Interop.Excel;
using System.Data.OleDb;
using Ganss.Excel;
using denemexx;

namespace homework
{
    
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Butona basıldığında program açacağı dosyanın path bilgisini kullanıcıya bırakmak yerine sırasıyla combobox ve textbox içindeki verileri belirli path'in üzerine ekleyip kendisi otomatik seçiyor
            var path = "C:\\Users\\emirm\\source\\repos\\denemexx\\PLASTİK ENJEKSİYON PARAMETRELERİ";//Excelmapper NUGet eklentisine path tanımı yapılıyor
            var makina = comboBox1.SelectedItem.ToString(); //yol dizimine "\" ekleyip comboboxda olan item numarasını ekliyor
            var urunk = textBox1.Text; // "C:\..\comboBox.selecteditem\" dizinine bir adet daha "\" ekleyip textbox da yazılı olan kodu path bilgsine ekliyor ve programı bu path dizinine yönelnediriyor
            var excelpath = Path.Combine(path, makina, urunk) + ".xlsx"; // eklediğimiz path dizisini birbirine hatasız bir şekilde kombine edebilmek için
            var products = new ExcelMapper(excelpath).Fetch<parametre>().ToList(); // parametre isimli class'ta excel den çekeceğimiz sütunları datagridview'da karşılık gelen satırları liste halinde tanımlaması yapılıyor
            textBox1.Clear();//program çalıştıktan sonra textBox u temizlemesi için
            //comboBox'u sıfırlaması için, butona ilk basıldığında itemleri siliyor daha sonra yeni item olarak aynı itemleri ekliyor
            comboBox1.Items.Clear();
            comboBox1.Items.Add("150-001");
            comboBox1.Items.Add("150-002");
            comboBox1.Items.Add("150-003");
            comboBox1.Items.Add("150-006");
            dataGridView1.DataSource = products; //datagridview kolonları products tanımına göre oluşturuluyor ve yine yukarıda products olarak tanımladığımız liste datasource olarak datagridview de tanımlanıp yansıtılıyor

          

        }
 private void Form1_Load(object sender, EventArgs e)
        {
            //kullanılacak makinaları combobox'a tanımlamak için kodlar
            comboBox1.Items.Add("150-001");
            comboBox1.Items.Add("150-002");
            comboBox1.Items.Add("150-003");
            comboBox1.Items.Add("150-006");
            
        }


Eklediğim Class'ta bulunan Kodlar
using Ganss.Excel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace denemexx
{
    public class parametre
    {
        //Excel Tablolarının dataGridView de karşılık geleceği kolonlar
        [Column("BİLGİ", MappingDirections.ExcelToObject)]
        public string Bilgi { get; set; }
        [Column("AÇIKLAMALAR VE BİLGİLER", MappingDirections.ExcelToObject)]
        public string Aciklama { get; set; }
        [Column("Mesafe (MM)", MappingDirections.ExcelToObject)]
        public string Mesafe { get; set; }
        [Column("Mesafe tolerans (MM)", MappingDirections.ExcelToObject)]
        public string MesafeTolerans { get; set; }
        [Column("Hız (%)", MappingDirections.ExcelToObject)]
        public string Hız { get; set; }
        [Column("Hız Tolerans (%)", MappingDirections.ExcelToObject)]
        public string HizTolerans { get; set; }
        [Column("Basınç (BAR)", MappingDirections.ExcelToObject)]
        public string Bacınc { get; set; }
        [Column("Basınç Tolerans (BAR)", MappingDirections.ExcelToObject)]
        public string BasıncTolerans { get; set; }
        [Column("Zaman (s)", MappingDirections.ExcelToObject)]
        public string Zaman { get; set; }
        [Column("Zaman Tolerans (s)", MappingDirections.ExcelToObject)]
        public string ZamanTolerans { get; set; }
        [Column("Set Derece 'C", MappingDirections.ExcelToObject)]
        public string SetDerece { get; set; }
        [Column("Tolerans", MappingDirections.ExcelToObject)]
        public string IsiTolerans { get; set; }
    }
}

Epsilon

Ben anladığım kadarıyla örnek bir program hazırladım
Siz buna göre referans alabilirsiniz








Epsilon

Bu arada en alttaki resimde D Sütünundaki "TAMKODU" A ve C sütünlarındaki kodların birleşimi.Excelde 2 hücreyi birleştirebilirsiniz .Böylece örneğin UOO3M002 demek 3 nolu kodun, 2 numaralı makina bilgileri olur.
Sağ taraftaki başlıkları oluşturmak için :
Tüm tabloyu (en altta eklediğim resimdeki)başlıklar dahil olmak üzere seçip "Ekle" den "Tablo" yu seçip üstten "Dilimleyici Ekle" diyerek devam edersiniz.
Örnek video:(02:30 dan itibaren dilimleyiciyi anlatıyor)