Son Haberler
Anasayfa / Yazılım / ASP.NET / DetailsView Kayıt Güncelleme

DetailsView Kayıt Güncelleme

Bir önceki yazımda DetailsView kontrolünde template işlemine başlamıştık. Şimdi bu yazının devamı niteliğinde devam ediyoruz. Dolayısı ile uygulamayı yapmak isteyenler aşağıdaki linkten ilgili dosyayı indirebilirler. Bu arada Northwind veri tabanı sizin serverinizda kurulu olması gerekiyor. Bunu da belirtelim.

http://www.ismailgursoy.com.tr/detailsview-kontrolu-template-kullanimi/

Şimdi uygulamamıza Update işlevselliğini kazandıralım. Bunun için ItemUpdating eventini kullanarak işlemimize başlayacağız. ItemUpdating eventi update butonu tıklandığında tetiklenir. Yani kullanıcı update edilecek sayfa üzerinde ilgili güncellemerini yapıp update butonuna tıkladığında bu olay gerçekleşir ve database tarafına kayıt etmek amacı ile bu olay tetiklenir.

Veritabanı kısmında güncelleme yapabilmek için sql query sorgumu her ne kadar code behind tarafında yapabilsem de ben bu yöntem yerine daha aktif bir yöntem olan sql tarafında bir stored procedure yazarak güncelleme işlemimi gerçekleştirmek istiyorum. Hem böylelikle SQL de stored procedure yazımını hatırlar ve code behind tarafında sql command olarak stored procedure kullanmış oluruz.

Sql Server Management Studio açalım ve Northwind veri tabanı üzerinde aşağıdaki Query’i yazalım.

CREATE PROCEDURE CalisanDetayBilgiGuncelle
(@EmployeeID int, @NewTitle NVARCHAR(30), @NewTitleOfCourtesy NVARCHAR(25), 
@NewBirthDate DATETIME, @NewHireDate DATETIME, @NewAddress NVARCHAR(60),
 @NewRegion NVARCHAR (15), @NewPostalCode NVARCHAR (10),  @NewCountry NVARCHAR (15))
AS UPDATE Employees SET Title = @NewTitle, TitleOfCourtesy = @NewTitleOfCourtesy,
BirthDate = @NewBirthDate, HireDate = @NewHireDate, Address = @NewAddress, 
Region = @NewRegion, PostalCode = @NewPostalCode, Country = @NewCountry 
WHERE EmployeeID = @EmployeeID

Stored Procedure de EmployeeID bilgisine göre DetailsView üzerinde listelenen verileri update etme işlemi gerçekleştirilir.

Şimdi tekrar Visual Studio ortamına dönelim ve Default.aspx sayfasının design bölümünde DetailsView kontrolünü seçelim. Daha sonra sağ tarafta yer alan properties alanından yıldırım işaretine tıklayalım. Daha sonra yanında yer alan kısımdan çift tıklayarak ItemUpdating eventinin oluşmasını sağlarız. Visual Studio code behind tarafında bizim için ilgili eventi oluşturur.

Daha sonra code behind tarafında Detailsview kontrolünün ItemUpdating eventi altında aşağıdaki kodları yazarız.

protected void DetayBilgi_ItemUpdating(object sender, DetailsViewUpdateEventArgs e)
    {
        //CalisanID ile update edilecek kişinin ID'si alınıyor.
        int calisanID = (int)DetayBilgi.DataKey.Value;
        //DetailsView kontrolüm içinde ilgili textboxlardan alınan veriler için TextBoxlarım oluşturuluyor
        TextBox newTitleTextBox = (TextBox)DetayBilgi.FindControl("txtTitle");
        TextBox newTitleofCourtesyTextBox = (TextBox)DetayBilgi.FindControl("txtTitleofCourtesy");
        TextBox newBirthDateTextBox = (TextBox)DetayBilgi.FindControl("txtBirthDate");
        TextBox newHireDateTextBox = (TextBox)DetayBilgi.FindControl("txtHireDate");
        TextBox newAddressTextBox = (TextBox)DetayBilgi.FindControl("txtAddress");
        TextBox newRegionTextBox = (TextBox)DetayBilgi.FindControl("txtRegion");
        TextBox newPostalCodeTextBox = (TextBox)DetayBilgi.FindControl("txtPostalCode");
        TextBox newCountryTextBox = (TextBox)DetayBilgi.FindControl("txtCountry");
        //Değiştirilen ya da değiştirimleyen tüm bilgileri değişkenlerime kaydediyorum
        string newTitle = newTitleTextBox.Text;
        string newTitleOfCourtesy = newTitleofCourtesyTextBox.Text;
        string newBirthDate = newBirthDateTextBox.Text;
        string newHireDate = newHireDateTextBox.Text;
        string newAddress = newAddressTextBox.Text;
        string newRegion = newRegionTextBox.Text;
        string newPostalCode = newPostalCodeTextBox.Text;
        string newCountry = newCountryTextBox.Text;
        //Sql bağlantımı, komutlarımı oluşturuyorum.
        SqlConnection conn;
        SqlCommand comm;
        string connectionstring = ConfigurationManager.ConnectionStrings["Baglantim"].ConnectionString;
        conn = new SqlConnection(connectionstring);
        //Stored Procedure kullanıyorum
        comm = new SqlCommand("CalisanDetayBilgiGuncelle", conn);
        comm.CommandType = CommandType.StoredProcedure;
        //komut parametrelerimi ve değerleri alacağı kısımları tanımlıyorum.
        comm.Parameters.Add("EmployeeID", SqlDbType.Int);
        comm.Parameters["EmployeeID"].Value = calisanID;
        comm.Parameters.Add("NewTitle", SqlDbType.NVarChar, 30);
        comm.Parameters["NewTitle"].Value = newTitle;
        comm.Parameters.Add("NewTitleOfCourtesy", SqlDbType.NVarChar, 25);
        comm.Parameters["NewTitleOfCourtesy"].Value = newTitleOfCourtesy;
        comm.Parameters.Add("NewBirthDate", SqlDbType.DateTime);
        comm.Parameters["NewBirthDate"].Value = newBirthDate;
        comm.Parameters.Add("NewHireDate", SqlDbType.DateTime);
        comm.Parameters["NewHireDate"].Value = newHireDate;
        comm.Parameters.Add("NewAddress", SqlDbType.NVarChar, 60);
        comm.Parameters["NewAddress"].Value = newAddress;
        comm.Parameters.Add("NewRegion", SqlDbType.NVarChar, 15);
        comm.Parameters["NewRegion"].Value = newRegion;
        comm.Parameters.Add("NewPostalCode", SqlDbType.NVarChar, 10);
        comm.Parameters["NewPostalCode"].Value = newPostalCode;
        comm.Parameters.Add("NewCountry", SqlDbType.NVarChar, 15);
        comm.Parameters["NewCountry"].Value = newCountry;
        //bağlantımı açıyorum
        try
        {
            conn.Open();
            //Herhangi bir veri listesi dönmeyeceği için ExecuteNonQuery diyorum
            comm.ExecuteNonQuery();
        }
        catch
        {
            //Hata olursa vereceğim mesaj
            Response.Write("Bir hata oluştu!");

        }
        finally
        {
            //Bağlantımı kapatıyorum
            conn.Close();
        }
        DetayBilgi.ChangeMode(DetailsViewMode.ReadOnly);
        veriBagla();
        DetayBilgiAl();

    }

Bu işlemlerin ardından uygulamamı çalıştırdığımda bir çalışan seçip seçiniz dedikten sonra detaylar tablosunda Edit diyorum.

Düzenleme moduna geçiliyor, burada ben örneğin Ülke alanını düzenledim, Türkiye dedim. Daha sonra Update butonuna tıkladığımda artık güncelleme işlemim gerçekleşiyor.

İşlemlerim bu kadar. Default.aspx.cs sayfasının tüm kodları :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //Sayfam daha önce yüklenmedi ise veriBagla metodumu çalıştırıyorum
        if (!IsPostBack)
        {
            veriBagla();
        }
    }
    //VeriBagla metodum
    private void veriBagla()
    {
        //SQL bağlantımı, komutumu ve datareader nesnemi tanımlıyorum.
        SqlConnection conn;
        SqlCommand comm;
        SqlDataReader reader;
        //Bağlantı satırımı ConfigurationManager sınıfı ile web config dosyasından atamış olduğum isimle çekiyorum.
        string connectionString = ConfigurationManager.ConnectionStrings["Baglantim"].ConnectionString;
        conn = new SqlConnection(connectionString);
        //SQL queryimi yazıyorum. Employees tablosundan çekmek istediğim verileri SELECT ile çekiyorum.
        comm = new SqlCommand("SELECT EmployeeID,LastName,FirstName,City,HomePhone FROM Employees", conn);
        try
        {
            //Bağlantımı açıyorum, dataReader nesnemi çalıştırıyorum ve GridView kontrolüme DataBind işlemi yapıyorum.
            conn.Open();
            reader = comm.ExecuteReader();
            GridView1.DataSource = reader;
            GridView1.DataKeyNames = new string[] { "EmployeeID" };
            GridView1.DataBind();
            //Reader nesnemi kapatıyorum
            reader.Close();
        }
            //hata olursa vereceğim mesaj
        catch
        {
            Response.Write("Bir hata oluştu");
        }
            //Bağlantımı kapatıyorum
        finally
        {
            conn.Close();
        }
    }

    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        //DetayBilgiAl adında bir metot tanımlayacağım bu metot GridView kontrolümün SelectedIndexChanged eventinde çalışacak.
        DetayBilgiAl();
    }
    //DetayBilgiAl metodum
    private void DetayBilgiAl()
    {
        //Seçili satırın indeks numarasını alıyorum ve EmployeeID için değerini case ediyorum.
        int selectedRowIndex = GridView1.SelectedIndex;
        int EmployeeID = (int)GridView1.DataKeys[selectedRowIndex].Value;
        //Sql bağlantımı, komutumu, datareader nesnemi tanımlıyorum.
        SqlConnection conn;
        SqlCommand comm;
        SqlDataReader reader;
        //Configurationmanager sınıfından bağlantı adresimi çekiyorum.
        string connectionstring = ConfigurationManager.ConnectionStrings["Baglantim"].ConnectionString;
        conn = new SqlConnection(connectionstring);
        //Detay bilgileri almak için SQL Query oluşturuyorum.
        comm = new SqlCommand("SELECT EmployeeID,LastName,FirstName,Title,TitleOfCourtesy,BirthDate,HireDate,Address,City,Region,PostalCode,Country,HomePhone FROM Employees WHERE EmployeeID=@EmployeeID", conn);
        //ilgili EmployeeID parametre değerine göre komutuma atama işlemi yapıyorum.
        comm.Parameters.Add("EmployeeID", System.Data.SqlDbType.Int);
        comm.Parameters["EmployeeID"].Value = EmployeeID;
        try
        {
            //Bağlantımı açıyorum ve verilerimi bağlama işlemi yapıyorum.
            conn.Open();
            reader = comm.ExecuteReader();
            DetayBilgi.DataSource = reader;
            DetayBilgi.DataKeyNames = new string[] { "EmployeeID" };
            DetayBilgi.DataBind();
            reader.Close();
        }
        catch
        {
            //hata olursa vereceğim mesaj
            Response.Write("Bir hata oluştu");
        }
        finally
        {
            //Bağlantımı kapatıyorum
            conn.Close();
        }
    }

    protected void DetayBilgi_ModeChanging(object sender, DetailsViewModeEventArgs e)
    {
        DetayBilgi.ChangeMode(e.NewMode);
        DetayBilgiAl();
    }
    protected void DetayBilgi_ItemUpdating(object sender, DetailsViewUpdateEventArgs e)
    {
        //CalisanID ile update edilecek kişinin ID'si alınıyor.
        int calisanID = (int)DetayBilgi.DataKey.Value;
        //DetailsView kontrolüm içinde ilgili textboxlardan alınan veriler için TextBoxlarım oluşturuluyor
        TextBox newTitleTextBox = (TextBox)DetayBilgi.FindControl("txtTitle");
        TextBox newTitleofCourtesyTextBox = (TextBox)DetayBilgi.FindControl("txtTitleofCourtesy");
        TextBox newBirthDateTextBox = (TextBox)DetayBilgi.FindControl("txtBirthDate");
        TextBox newHireDateTextBox = (TextBox)DetayBilgi.FindControl("txtHireDate");
        TextBox newAddressTextBox = (TextBox)DetayBilgi.FindControl("txtAddress");
        TextBox newRegionTextBox = (TextBox)DetayBilgi.FindControl("txtRegion");
        TextBox newPostalCodeTextBox = (TextBox)DetayBilgi.FindControl("txtPostalCode");
        TextBox newCountryTextBox = (TextBox)DetayBilgi.FindControl("txtCountry");
        //Değiştirilen ya da değiştirimleyen tüm bilgileri değişkenlerime kaydediyorum
        string newTitle = newTitleTextBox.Text;
        string newTitleOfCourtesy = newTitleofCourtesyTextBox.Text;
        string newBirthDate = newBirthDateTextBox.Text;
        string newHireDate = newHireDateTextBox.Text;
        string newAddress = newAddressTextBox.Text;
        string newRegion = newRegionTextBox.Text;
        string newPostalCode = newPostalCodeTextBox.Text;
        string newCountry = newCountryTextBox.Text;
        //Sql bağlantımı, komutlarımı oluşturuyorum.
        SqlConnection conn;
        SqlCommand comm;
        string connectionstring = ConfigurationManager.ConnectionStrings["Baglantim"].ConnectionString;
        conn = new SqlConnection(connectionstring);
        //Stored Procedure kullanıyorum
        comm = new SqlCommand("CalisanDetayBilgiGuncelle", conn);
        comm.CommandType = CommandType.StoredProcedure;
        //komut parametrelerimi ve değerleri alacağı kısımları tanımlıyorum.
        comm.Parameters.Add("EmployeeID", SqlDbType.Int);
        comm.Parameters["EmployeeID"].Value = calisanID;
        comm.Parameters.Add("NewTitle", SqlDbType.NVarChar, 30);
        comm.Parameters["NewTitle"].Value = newTitle;
        comm.Parameters.Add("NewTitleOfCourtesy", SqlDbType.NVarChar, 25);
        comm.Parameters["NewTitleOfCourtesy"].Value = newTitleOfCourtesy;
        comm.Parameters.Add("NewBirthDate", SqlDbType.DateTime);
        comm.Parameters["NewBirthDate"].Value = newBirthDate;
        comm.Parameters.Add("NewHireDate", SqlDbType.DateTime);
        comm.Parameters["NewHireDate"].Value = newHireDate;
        comm.Parameters.Add("NewAddress", SqlDbType.NVarChar, 60);
        comm.Parameters["NewAddress"].Value = newAddress;
        comm.Parameters.Add("NewRegion", SqlDbType.NVarChar, 15);
        comm.Parameters["NewRegion"].Value = newRegion;
        comm.Parameters.Add("NewPostalCode", SqlDbType.NVarChar, 10);
        comm.Parameters["NewPostalCode"].Value = newPostalCode;
        comm.Parameters.Add("NewCountry", SqlDbType.NVarChar, 15);
        comm.Parameters["NewCountry"].Value = newCountry;
        //bağlantımı açıyorum
        try
        {
            conn.Open();
            //Herhangi bir veri listesi dönmeyeceği için ExecuteNonQuery diyorum
            comm.ExecuteNonQuery();
        }
        catch
        {
            //Hata olursa vereceğim mesaj
            Response.Write("Bir hata oluştu!");

        }
        finally
        {
            //Bağlantımı kapatıyorum
            conn.Close();
        }
        DetayBilgi.ChangeMode(DetailsViewMode.ReadOnly);
        veriBagla();
        DetayBilgiAl();

    }
}

Aşağıdaki linkten uygulamayı indirebilirsiniz..

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir