• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

DataGridView da Alan hesabı C#

  • Konbuyu başlatan Konbuyu başlatan k0081
  • Başlangıç tarihi Başlangıç tarihi
Katılım
17 Haziran 2008
Mesajlar
1,874
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Merhaba arkadaşlar;

Datagridview da bir hesap yapmak istiyorum. datagridviwe 4 kolondan oluşuyor Nokta No X Y Z şeklinde...

aşağıdaki verilerde sadece Z bilgisi yok. ihtiyacımız da yok.


No X Y
------------------
1 389.634 209.299
2 337.222 92.005
3 179.626 116.397
4 223.063 242.658

şimdi bu verilere göre Alan : 21121.97 m² çıkması gerekiyor.

Formülümüz şu şekilde :


formüldeki A B C D E = 1 2 3 4 5 şeklinde nokta numaralarını ifade etmektedir...


yardımcı arkadaşa şimdiden teşekkürler.


 
Merhaba,
Sorunuzun cevabı değil ama Listbox üzerinde yapılmış hali ektedir, sanırım siz uyarlayabilirsiniz...
Harici Link
 

Ekli dosyalar

@ÖmerBey

başka bir örnek yaptım. işlem sonucu doğru fakat, virgülden sonraki küsaratta hata var. bir de sonuç negatif çıkıyor ( - ) şu an yaptığım örnekte... 7 nokta kullandım
 
Son düzenleme:
Tekrar merhaba,
Virgülden sonraki hata yuvarlama kaynaklı olabilir. Sonucun negatif çıkması da Y değerlerinin ters çıkarılması sonucu olabilir. Paylaştığınız formülde üstteki değerden alttaki çıkarılıyor.
Elimde değerler ve olması gereken sonuç olmadığı için deneme imkanım olmuyor, birkaç farklı örnek paylaşırsanız oluşan hatanın kaynağını anlayabiliriz sanıyorum.
 
Tabiki... aynen dediğiniz gibi X ve Y yönünden negatif çıkmış... tamamdır sorun yok. küsaratta doğru çıktı.

Şimdi oradaki formül aslında şu : 2F = Yn x ( Xn -1 - Xn + 1)

benim ikinci olarak denediğim koordinatlar :

1 177.827 105.513
2 467.798 503.093
3 1324.358 487.860
4 757.447 75.638
5 359.180 79.446
6 179.103 30.893
7 177.827 105.513

yani bunu nasıl düzenleyeceğim , ? biraz daha detay lazım... ilk iki satırı anladım. yani listbox ı bir listeye alıyoruz.. numara olmadan sanırım.

alt kısımları anlayamadım...
 
Yazdığım kodda aslolan 2. dizi. Çünkü; bütün işlem ikinci dizide yapılıyor. İlk diziyi pratik olarak listboxu kullanmak için oluşturdum, doğrudan listboxtan da veri alınabilir.
Burada dikkat edeceğimiz husus listedeki ilk ve son değerler. Çünkü; formüldeki n-1 ve n+1 değerlerinin hata vermemesi gerekiyor. Bunun için de listeye 2 eleman daha ekliyoruz; bunlardan biri en başa (son değer), diğeri de en sona (ilk değer). Normalde 1,2,3,4 şeklinde olan listemiz 4,1,2,3,4,1 şekline dönüşüyor. Sonra da bu listenin 2. elemanından sondan 2. elemanına kadar döngü kurup sıralı toplama yaptırıyoruz.
Kısaca aşağıdaki tablodaki


1​

389,634​

209,299​

2​

337,222​

92,005​

3​

179,626​

116,397​

4​

223,063​

242,658​
şeklindeki değerleri




4​

223,063​

242,658​

1​

389,634​

209,299​

2​

337,222​

92,005​

3​

179,626​

116,397​

4​

223,063​

242,658​

1​

389,634​

209,299​
şekline dönüştürüyoruz (ilk sütün olmadan)


Umarım açıklayabilmişimdir.
 
Son düzenleme:
Yazdığım kodda aslolan 2. dizi. Çünkü; bütün işlem ikinci dizide yapılıyor. İlk diziyi pratik olarak listboxu kullanmak için oluşturdum, doğrudan listboxtan da veri alınabilir.
Burada dikkat edeceğimiz husus listedeki ilk ve son değerler. Çünkü; formüldeki n-1 ve n+1 değerlerinin hata vermemesi gerekiyor. Bunun için de listeye 2 eleman daha ekliyoruz; bunlardan biri en başa (son değer), diğeri de en sona (ilk değer). Normalde 1,2,3,4 şeklinde olan listemiz 4,1,2,3,4,1 şekline dönüşüyor. Sonra da bu listenin 2. elemanından sondan 2. elemanına kadar döngü kurup sıralı toplama yaptırıyoruz.
Kısaca aşağıdaki tablodaki


1​



389,634​



209,299​



2​



337,222​



92,005​



3​



179,626​



116,397​



4​



223,063​



242,658​

şeklindeki değerleri



4​



223,063​



242,658​



1​



389,634​



209,299​



2​



337,222​



92,005​



3​



179,626​



116,397​



4​



223,063​



242,658​



1​



389,634​



209,299​

şekline dönüştürüyoruz (ilk sütün olmadan)

Umarım açıklayabilmişimdir.

Tamam. biraz daha netleşti... bakacağım. yani bunu Excel de bir tabloda Üniversitede iken yapmıştım. hala arşivimde durur. Fakat bunu C# dönüştürmek istiyorum., bu son gönderdiğiniz mesaj üzerinden gideceğim bakalım... C# da yeniyim..

Çok teşekkürler yardımların için. Eyvallah.
 


Bu aslında bildiğimiz klasik "Cross Metoduyla" alan hesaplama formülü...

VBA'de şöyle ufak bir fonksiyon kullanılabilir;

C#:
Function getArea(Xs As Range, Ys As Range) As Double
    Dim i As Integer, tempArea As Double
    
    For i = 1 To Xs.Rows.Count - 1
        tempArea = tempArea + (Xs(i + 1) + Xs(i)) * (Ys(i + 1) - Ys(i))
    Next
    
    getArea = Abs(tempArea + (Xs(1) + Xs(Xs.Rows.Count)) * (Ys(1) - Ys(Ys.Rows.Count))) / 2
End Function


Fonksiyonun kullanımı;



.
 
@Haluk



Evet Cross metod...

Teşekkür ederim hocam. Ama bunu C# -datagridview üzerinden yapmam gerekiyor... sanırım bu kodlar yardımcı olur... deneyeceğim.
 
JavaScript ile yapılması, C# ile benzerlik sağlar mı bilmiyorum .... ama önemli olan hem VBA hem de aşağıdaki Javascript kodunda X ve Y koordinatlarını ayrı ayrı 2 Array'e (dizi) aldıktan sonra gerisi zaten kolay. Alan, hiçbir zaman negatif çıkamayacağı için de sonucun mutlak değerini alıyoruz.

JavaScript:
<html>
<body>

<div id="demo"></div>

<script>     
    n = 4

    Xs = [389.634, 337.222, 179.626, 223.023];
    Ys = [209.299, 92.005, 116.397, 242.658];

    area = 0;

    for (var i=0; i < n-1;i++){
        area = area + Xs[i]* Ys[i+1] - Ys[i]* Xs[i+1]
    }


    area = Math.abs(area + Xs[n-1]*Ys[0]- Ys[n-1]*Xs[0])/2;

    alert("Alan = "+ area);
    document.getElementById("demo").innerHTML = "Alan = " + area.toFixed(4)

</script>

</body>
</html>



Örnek ektedir....


.
 
Son düzenleme:
JavaScript ile yapılması, C# ile benzerlik sağlar mı bilmiyorum .... ama önemli olan hem VBA hem de aşağıdaki Javascript kodunda X ve Y koordinatlarını ayrı ayrı 2 Array'e (dizi) aldıktan sonra gerisi zaten kolay. Alan, hiçbir zaman negatif çıkamayacağı için de sonucun mutlak değerini alıyoruz.

JavaScript:
<html>
<body>

<div id="demo"></div>

<script>    
    n = 4

    Xs = [389.634, 337.222, 179.626, 223.023];
    Ys = [209.299, 92.005, 116.397, 242.658];

    area = 0;

    for (var i=0; i < n-1;i++){
        area = area + Xs[i]* Ys[i+1] - Ys[i]* Xs[i+1]
    }


    area = Math.abs(area + Xs[n-1]*Ys[0]- Ys[n-1]*Xs[0])/2;

    alert("Alan = "+ area);
    document.getElementById("demo").innerHTML = "Alan = " + area.toFixed(4)

</script>

</body>
</html>



Örnek ektedir....


.

iyice netleşti... gerisi bende ... Çok teşekkürler...
 
yapı tamam... datagridview dan iki dizi oluşturduğum zaman bu iş bitmiştir.


Yardımcı arkadaşlar çok teşekkür ediyorum.


C#:
 private void lblAlnKoord_Click(object sender, EventArgs e)
        {
            int n = 4;

            double[] Xs = { 389.634, 337.222, 179.626, 223.023 };

            double[] Ys = { 209.299, 92.005, 116.397, 242.658 };

            double area = 0;

            for (var i = 0; i < n - 1; i++)
            {
                area = area + Xs[i] * Ys[i + 1] - Ys[i] * Xs[i + 1];
            }


            area = Math.Abs(area + Xs[n - 1] * Ys[0] - Ys[n - 1] * Xs[0]) / 2;

            MessageBox.Show("Alan : " + area.ToString());
        }
 
Deneme şansım yok ama, siz bir deneyin.... (dataGridView1 2 sütunsa; Cells[1] yerine Cells[0] ve Cells[2] yerine Cells[1] kullanmayı deneyin)

C#:
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
    Xs[i] = dataGridView1.Rows[i].Cells[1].Value.ToString();
    Ys[i] = dataGridView1.Rows[i].Cells[2].Value.ToString();
}


ToString() kısmı gerekli mi, bilemedim....


.
 
Son düzenleme:
Haluk hocam, şu şekilde çözdüm;

C#:
           int n = dataGridView1.RowCount - 1;
            List<double> Xs = new List<double>();
            List<double> Ys = new List<double>();

            foreach (DataGridViewRow dgvr in dataGridView1.Rows)
            {
                Xs.Add(Convert.ToDouble(dgvr.Cells[1].Value));
                Ys.Add(Convert.ToDouble(dgvr.Cells[2].Value));
            }


Güzel oldu. Tekrar teşekkür ederim.
 
Geri
Üst