Şimdi Ara

C# ta static değişken???

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
10
Cevap
0
Favori
3.258
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Bir proje üzerinde çalışacağım.Fakat bir deneme yapayım dedim ve işin içinden çıkamadım.Aşağıdaki kodlarda gördüğünüz gibi global ve static olan bir datatable tanımladım.Amacım datatable ın textbox lardan aldığı veriyi tutması.Fakat visual studioda debug ı durdurup browser ı kapatmama rağmen datatable ın içi boşalmıyor. Bunu bir butona datatable.clear olarak yaptırabilirm ki asıl sorun şurda.Bu kodu server a atıp aynı anda 2 client bağlandığında ikiside aynı datatable ı görüyor ve kullanıyor.Yani girilerin verilerin karışma sorunu var.Bunu nasıl çözebilirim?Datatable ı static yapmasam bu sefer niye bilmiyorum veriyi hiç tutmuyor.

    using System; 
    using System.Collections;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    using System.Data.SqlClient;
    using System.Text.RegularExpressions;
    using System.Data.SqlClient;

    public partial class _Default : System.Web.UI.Page
    {
    private static DataTable tablo = new DataTable();

    protected void Page_Load(object sender, EventArgs e)
    {
    if (!IsPostBack)
    {
    if(!tablo.Columns.Contains("IstasyonKodu"))
    tablo.Columns.Add("IstasyonKodu", typeof(string));
    }
    Label1.Text = "1";
    Label2.Text = "2";
    Label3.Text = "3";
    Panel2.Visible = false;
    Panel3.Visible = false;


    }
    protected void Button1_Click(object sender, EventArgs e)
    {
    DataRow newrow = tablo.NewRow();
    newrow["IstasyonKodu"] = TextBox1.Text;
    tablo.Rows.Add(newrow);
    GridView1.DataSource = tablo;
    GridView1.DataBind();
    Panel1.Visible = false;
    Panel2.Visible = true;
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
    DataRow newrow = tablo.NewRow();
    newrow["IstasyonKodu"] = TextBox2.Text;
    tablo.Rows.Add(newrow);
    GridView1.DataSource = tablo;
    GridView1.DataBind();
    Panel2.Visible = false;
    Panel3.Visible = true;
    }
    protected void Button3_Click(object sender, EventArgs e)
    {
    DataRow newrow = tablo.NewRow();
    newrow["IstasyonKodu"] = TextBox3.Text;
    tablo.Rows.Add(newrow);
    GridView1.DataSource = tablo;
    GridView1.DataBind();
    Panel3.Visible = false;
    Panel1.Visible = true;

    }
    }



     
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="deneme.aspx.cs" Inherits="_Default" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <title></title>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>

    <br />
    <asp:Panel ID="Panel1" runat="server" style="font-weight: 700">
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    <asp:Button ID="Button1" runat="server" onclick="Button1_Click"
    Text="Button" />
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    </asp:Panel>
    <asp:Panel ID="Panel2" runat="server">
    <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
    <asp:Button ID="Button2" runat="server" onclick="Button2_Click"
    Text="Button" />
    <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
    </asp:Panel>
    <br />

    </div>
    <asp:Panel ID="Panel3" runat="server">
    <asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>
    <asp:Button ID="Button3" runat="server" onclick="Button3_Click"
    Text="Button" />
    <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
    </asp:Panel>
    <br />
    <p>
     </p>
    <asp:GridView ID="GridView1" runat="server">
    </asp:GridView>
    </form>
    </body>
    </html>








  • selamlar kardeşim. anlaşılması aslında çok basit görünse de çok zor , çok zor gibi gözükse de çok basit bir olayla karşı karşıyasın. Postback!

    C# projelerinde bazen anlamlı dursa da anlamsız çalışan bir olay. ben bunca yıldır çalışırım hala bazen ne yaptıgını kestirmek zor:)

    bunun üzerine bir makale ayarında birşey yazabilirim ama ne vaktim yeter ne ömrüm. şöyle açıklayayım içine düştüğün durumu.

    datatableyi static yapıyorsun, değeri içine atıyorsun , değişmiyor, ama elinde en azından bir datatable oluyor, statiği kaldırıyorsun ama butona basınca boş bir datatablen oluyor.

    neyse bunu önlemenin en kısa çözümü ama sunucunun canına (çoklu kullanımlarda) okuyan session mantıgıdır . session her kullanıcı için ayrı ayrı açılır ve nesleleri birbirinden farklıdır. bir nevi static gibi davranır ama her sayfadan her yerden sunucu kapatılmadıgı veya timeout olmadıgı sürece tutulur.

    datatablene new row diyip bir row ekliyorsun ve bir ekleme işlemi yaptıktan sonra
    Session["tablo"] = table;
    diyip session arrayında "table" indexine tablonu attın. artık datatablonu unut onun üzerinden hiçbir işlem yapmayacaksın

    bütün işlemlerini Session["table"] üzerinden yapacaksın.

    bir sonraki ekleme işleinde ise
    DataTable dt = (DataTable) Session["table"] ;
    olarak datatable tanımlayacaksın.
    eklemeni bu "dt" ismindeki datatablene atıp
    Session["tablo"] = dt;
    diyip datatablenin row eklenmiş halini gene sessiona atacaksın.
    gridviewini de sürkli
    Gridview1.Datasource= (DataTable) Session["tablo"];
    Gridview1.DataBind();

    diyerek güncelleyeceksin. böyle gider. daha farklı metorlar için bana pm atabilirsin ama yoğunluktan dolayı ne ara cevap veririm muamma




  • @ Kaygerya hızlı yanıtın için teşekkür ederim.
    Arkadaşıma sordum ve bir yardım aldım.Benim gibi birçok kişinin problemiymiş bu.
    ViewState denen bir yolla o anki datatable değişkenini tutabiliyorum artık.Bu sadece datatable için değil herşey için kullanılabileceğinden çok hoşuma gitti.
    Yarın iş yerindeki server da yapacağım denemelerimi.Farklı pc ler üzerindede farklı table lar ile çalışabilirsem tam benlik bir çözüm olmuş olacak.
  • Viewstate çok fazla kullanılması iyi olmayan bişeydir. Ben olsam, veritabanında bir tablo oluştururdum, bu datatable daki verileri oraya yazar, id bilgisini query string olarak veya session olarak aktarırdım diğer sayfalara.
  • Kullanılması neden iyi değil? Ayrıca verileri zaten kontrolleri yaptıktan sonra database e işleyeceğim.Fakat kontrollerden önce database de geçici bir tablo oluşturmak ve çöplük yaratmak istemiyorum.Mssql de temp kullanımı gibi birşey var galiba onuda tam olarak bilmediğimden bu işe kalkışmadım.Temel sıralama tarzı işlemler haricindeki birçok işimi database ve mssql query leri kullanmak yerine c# ı daha aktif kullanabildiğimden dolayı orda yapmak kolayıma geliyor açıkçası :))
  • Eğer çok fazla kullanmayacaksan sorun değil ama viewstate verisi çoksa performans olarak zarar verebilir.
  • Günümüz trendi ve gelicekde tablet üzerine simdi zayıf donanımları olsada gelicekde performans artar gerçi win8 tablet için, ms .net gibi bir katmanını işe katmamak için RT yi işini cine sokmus tabletlerde buda .net ciler icin dez avantaj gibi duruyor ama eninde sonunda programcılık nesne tabanlı hatta daha otesi olucagından .net den vazgeçilemez ilerde donımlar geliştikce işin icinde yine olur .net
    .net varlıgını tablettede surdurucekdir bunun kanıtı mvc dir asp.net gibi agır sayfaları ve server git gelleri yok temiz bir cıktı sunuyor ayrıca bir baska trend seo için dogal destek sunuyor ve acık kaynak destegide cabası denetleyiciside ms insan dahane ister ?! mvc gunumuz trendi yani acık kaynak az is ve cok performans...



    < Bu mesaj bu kişi tarafından değiştirildi fsh77 -- 18 Nisan 2012; 13:13:24 >
  • viewstate değerleri sayfa içinde şifreli bir biçimde tutulur. bu şifreler kırılabilir. yani zaten kullanıcının verisini viewstatede tutacağın için aslında şifrelenmese bile olur. bu yapıda bir kaygı taşımazsın. ama sunucuda derlenen bir sonuç işlem vs gibi birşeyi viewstatede tutamazsın. tutmamalısın da. bu konuda session daha iyidir. sessionda da veri sunucunun raminde tutulur. erişilmesi serverin erişilmesi ile aynnıdır zaten servere erişen sessionla ilgilenmez :) hani karar senin.
  • Herkese ayrı ayrı teşekkür ederim. En nihayetinde bu viewstate benim problemimi çözüyor.Çünkü ben bunu fatura girişleri için kullanacağım.Sadece datatable ı viewstate e aktaracağım.Bundada yaklaşık 10 column 20 row olur.En son kontrollerimi yaptıktan sonra zaten bu tabloyu mssql kaydedeceğim.Yani şifreli özel veriler olmayacak bu yüzden bu verilerin güvenliği dışarıya açık olabilir :D
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.