C# DevExpress gridview dinamik tabloya veri kayıt etme nasıl yapılır?

genslife

Decapat
Katılım
16 Ağustos 2022
Mesajlar
159
Çözümler
5
Yer
Diyarbakır
Daha fazla  
Cinsiyet
Erkek
Meslek
IT Uzmanı
Merhaba,

Şirketimiz için geliştirmekte olduğumuz bir portalde yöneticimiz kendi istediği gibi sisteme yeni modül ekliyor. Modül ekleme işlemi yaparken arka tarafta her bir modül için yeni bir veritabanı tablosu oluşturuyor. Modül oluştuktan sonra modül içerisinde görünmesini istediği sütunları da tek tek ekliyor. Burada eklerken aynı anda veritabanına eklenen tabloyada sütun ekliyor sistem. Modül oluşturma alanında sıkıntı yok.

Oluşan tabloya göre her modüle bir veri kayıt formu nasıl oluşturabilirim? Kayıt formunun içerisinde bulunacak textbox veya dropdown, datetime alanlarını tablodaki sütunlara göre nasıl dinamik olarak sayfada gösterebilirim?

@delikarga
 
Son düzenleme:
Bu birebir ve orten bir fonksiyon ile yapilamaz eger kullanici UI elementini direkt soylemezse.

Bazi data type'lar icin UI tarafindaki tercih az cok belli olsa da ( ornegin datetime ) , varchar bir alana karsilik dropdown da gelebilir input text field da gelebilir. Dropdown icin diger olasi secimlerin ne oldugunu da bilmek gerekiyor.

Ya da integer bir alan enum bir degeri de temsil ediyor olabilir ordinal sekilde. bit(1) alan boolean da olabilir bitset de olabilir.

Bu tarz dinamin UI ve backend olusturmali hedeler yapilirken kullanicidan UI tarafini da olusturmasini istemek en mantiklisi.

Yani:
"Modül oluştuktan sonra modül içerisinde görünmesini istediği sütunları da tek tek ekliyor."

Ustteki islem yapilirken, her column icin UI tarafinda da kullanmak istedigi UI elementini belirtmesi ve bunun da DB de tutulmasi bence en makulu.

Ornegin "Cinsiyet" isimli column icin dropdown olur ve secenek olarak "erkek, kadin ya da belirtmek istemiyorum" olur seklinde secer yonetici modul tasarimi sirasinda. Sen de bunu C# tarafinda direkt enum ile maplersin.
 
Bu birebir ve orten bir fonksiyon ile yapilamaz eger kullanici UI elementini direkt soylemezse.

Bazi data type'lar icin UI tarafindaki tercih az cok belli olsa da ( ornegin datetime ) , varchar bir alana karsilik dropdown da gelebilir input text field da gelebilir. Dropdown icin diger olasi secimlerin ne oldugunu da bilmek gerekiyor.

Ya da integer bir alan enum bir degeri de temsil ediyor olabilir ordinal sekilde. bit(1) alan boolean da olabilir bitset de olabilir.

Bu tarz dinamin UI ve backend olusturmali hedeler yapilirken kullanicidan UI tarafini da olusturmasini istemek en mantiklisi.

Yani:
"Modül oluştuktan sonra modül içerisinde görünmesini istediği sütunları da tek tek ekliyor."

Ustteki islem yapilirken, her column icin UI tarafinda da kullanmak istedigi UI elementini belirtmesi ve bunun da DB de tutulmasi bence en makulu.

Ornegin "Cinsiyet" isimli column icin dropdown olur ve secenek olarak "erkek, kadin ya da belirtmek istemiyorum" olur seklinde secer yonetici modul tasarimi sirasinda. Sen de bunu C# tarafinda direkt enum ile maplersin.
Merhaba,

Sizinde belirttiğiniz gibi UI tarafında sütun eklerken sütunun değerinin ne olacağını seçtiriyorum yöneticiye.

Örnek tablo görseli paylaşayım size.

Hangi mantıkla ilerlemeliyim? Aslında veritabanına oluşan herşeyi ayrıca bir tablo içerisindede tutuyorum.

1695736309448.png
 
Merhaba,

Sizinde belirttiğiniz gibi UI tarafında sütun eklerken sütunun değerinin ne olacağını seçtiriyorum yöneticiye.

Örnek tablo görseli paylaşayım size.

Hangi mantıkla ilerlemeliyim? Aslında veritabanına oluşan herşeyi ayrıca bir tablo içerisindede tutuyorum.

Eki Görüntüle 1957645

Bence her column tipini satisfy eden UI tipini column tipi sectikten sonra secmeli.

Mesela cok adimli su sekilde:

Column Tipi Seciniz ( Text secildi ):
1. Text
2. Hede
3. Hodo

UI tipini seciniz: ( Fixed choice input secildi )
1. Single line input ( kullanici istedigi input'u girer )
2. Rich text input ( multi-line input , html textarea gibi )
3. Large text input ( blob ya da largetext tutulabilir, uzun metin alani )
4. Fixed choice text input ( dropdown gorunecek )

UI field zorunlu mu: ( nullable = false )
1. Evet
2. Hayir

Eger fixed choice secildi ise potansiyel degerler ne olmali:
1. Hede
2. Hodo

Biraz over-engineering yapmis olabilirim, siz kendi ihtiyaclariniza gore basite indirgeyebilirsiniz.

Ancak Text -> Fixed choice -> Zorunlu input icin C# da enum, DB de nullable=false varchar ve select opsiyonlarinin tercihlerinin de tutuldugu alanlar olmali.

Mantikli geliyor mu soylediklerim?
 
Hocam söyledikleriniz mantıklı fakat şuanda benim önceliğim alanların oluşturulmasından çok oluşturulan bu alanları sistem üzerinde her modüle bir veri kayıt formunu veritabanında oluşturulan tablo ve sütunlara göre oluşturabilmek. Yani kullanıcı oluşturduğu tabloya verilerini nasıl kayıt edecek.

Şöyle birşey mantıklımı sizce her oluşturulan modül için arka tarafta birde html form sayfası oluşturmak. Veya oluşturulan bu tablo ve sütunları c# tarafında nasıl dinamik olarak gösterebilirim?
 
Hocam söyledikleriniz mantıklı fakat şuanda benim önceliğim alanların oluşturulmasından çok oluşturulan bu alanları sistem üzerinde her modüle bir veri kayıt formunu veritabanında oluşturulan tablo ve sütunlara göre oluşturabilmek. Yani kullanıcı oluşturduğu tabloya verilerini nasıl kayıt edecek.

Şöyle birşey mantıklımı sizce her oluşturulan modül için arka tarafta birde html form sayfası oluşturmak. Veya oluşturulan bu tablo ve sütunları c# tarafında nasıl dinamik olarak gösterebilirim?

O halde default bir mapping yapmak gerekli, oncelik sistemin bastan uca calismasiysa. C# desktop UI elementlerini bilmiyorum ama html uzerinden giderek en basit mapping tablonun metadata bilgisine bakarak olusturulabilir. Ornegin MySQL icin describe my_table; ile her column icin data type alirsin, bunu da switch ile html form elementine donusturebilirsin. Birden fazla case ayni elemente donusecegi icin ve bazi data type'lar birden fazla elementle reprezente edilebilecegi icin ilk mesajimda "birebir ve orten fonksiyon olmaz" dedim. Ama basit bir default model yazilabilir.

Kod:
form = "<form>"

table_description = sql.execute('describe my_table')
columns = extract_columns(table_description)  // ORM ya da string op. ile

for column in columns:
    switch column.type
        case 'text':
        case 'varchar':
        case 'smalltext':
            form += '<input type="text" name="column.name"/>'
        case 'date'
            form += '<input type="date" />'

Kabaca bu sekilde form olusturabilirsin. Aslinda column type ile html input type mapping yapmak ozunde. input name ile column name match oldugundan hangi web framework'unu kullaniyorsan kullan bu temel mappingi o zaten senin icin yapacaktir.

Bence bu DB Table -> UI transformasyonu sonucunu database'de saklamaya gerek yok. Bu islem hem yeterince hizli olacaktir hem de zamanla degisecektir, her defasinda UI yeniden hesaplanabilir.

Zamanla adaptor pattern kullanarak ayni tablo HTML ve C# form outputu uretecek interface'ler ile desteklenebilir.
 
Son düzenleme:
Hocam cevaplarınız için çok teşekkürler. Form sayfası işini aşağıdaki kod ile çözdüm. Şimdi bu formu sql insert yapmak için araştırma yapıyorum. Bu konudada fikriniz varmı?


C#:
protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {

            }
            else
            {
                SqlConnection db_baglanti;
                db_baglanti = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlServer"].ConnectionString);
                db_baglanti.Open();

                var ModulId = Request["modulid"];


                SqlCommand komutTabloAdi = new SqlCommand("select Modul_SqlTabloAdi from Moduller where id=" + ModulId + "", db_baglanti);
                string tabloadi = (string)komutTabloAdi.ExecuteScalar();

                string connectionString = ConfigurationManager.ConnectionStrings["sqlServer"].ConnectionString;
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    SqlCommand command = new SqlCommand("SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" + tabloadi + "' ", connection);
                    SqlDataReader reader = command.ExecuteReader();
                    List<TableSchema> tableSchema = new List<TableSchema>();
                    while (reader.Read())
                    {
                        tableSchema.Add(new TableSchema
                        {
                            ColumnName = reader.GetString(0),
                            DataType = reader.GetString(1)
                        });
                    }
                    reader.Close();

                    // Create an HTML form based on the table schema.
                    string htmlForm = GenerateHtmlForm(tableSchema);
                    // Display the HTML form on the web page.
                    Literal1.Text = htmlForm;
                }
                

            }
        }

        private string GenerateHtmlForm(List<TableSchema> tableSchema)
        {
            StringBuilder formHtml = new StringBuilder();
            formHtml.AppendLine("<form>");
            foreach (var column in tableSchema)
            {
                if (column.DataType == "datetime")
                {
                    formHtml.AppendLine($"<label for=\"{column.ColumnName}\">{column.ColumnName}</label>");
                    formHtml.AppendLine($"<div class=\"input-group date\" id=\"reservationdatetime\" data-target-input=\"nearest\" >");
                    formHtml.AppendLine($"<input type=\"text\" id=\"{column.ColumnName}\" class=\"form-control datetimepicker-input\" data-target=\"#reservationdatetime\" />");
                    formHtml.AppendLine($"<div class=\"input-group-append\" data-target=\"#reservationdatetime\" data-toggle=\"datetimepicker\">");
                    formHtml.AppendLine($"<div class=\"input-group-text\" ><i class=\"fa fa-calendar\" ></i></div>");
                    formHtml.AppendLine($"</div>");
                    formHtml.AppendLine($"</div>");
                }
                else
                {
                    formHtml.AppendLine($"<label for=\"{column.ColumnName}\">{column.ColumnName}</label>");
                    formHtml.AppendLine($"<input type=\"text\" class=\"form-control\" id=\"{column.ColumnName}\" name=\"{column.ColumnName}\" />");
                }
                
            }
            formHtml.AppendLine("</form>");
            return formHtml.ToString();
        }

        public class TableSchema
        {
            public string ColumnName { get; set; }
            public string DataType { get; set; }
        }
 
Hocam cevaplarınız için çok teşekkürler. Form sayfası işini aşağıdaki kod ile çözdüm. Şimdi bu formu sql insert yapmak için araştırma yapıyorum. Bu konudada fikriniz varmı?


C#:
protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {

            }
            else
            {
                SqlConnection db_baglanti;
                db_baglanti = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlServer"].ConnectionString);
                db_baglanti.Open();

                var ModulId = Request["modulid"];


                SqlCommand komutTabloAdi = new SqlCommand("select Modul_SqlTabloAdi from Moduller where id=" + ModulId + "", db_baglanti);
                string tabloadi = (string)komutTabloAdi.ExecuteScalar();

                string connectionString = ConfigurationManager.ConnectionStrings["sqlServer"].ConnectionString;
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    SqlCommand command = new SqlCommand("SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" + tabloadi + "' ", connection);
                    SqlDataReader reader = command.ExecuteReader();
                    List<TableSchema> tableSchema = new List<TableSchema>();
                    while (reader.Read())
                    {
                        tableSchema.Add(new TableSchema
                        {
                            ColumnName = reader.GetString(0),
                            DataType = reader.GetString(1)
                        });
                    }
                    reader.Close();

                    // Create an HTML form based on the table schema.
                    string htmlForm = GenerateHtmlForm(tableSchema);
                    // Display the HTML form on the web page.
                    Literal1.Text = htmlForm;
                }
               

            }
        }

        private string GenerateHtmlForm(List<TableSchema> tableSchema)
        {
            StringBuilder formHtml = new StringBuilder();
            formHtml.AppendLine("<form>");
            foreach (var column in tableSchema)
            {
                if (column.DataType == "datetime")
                {
                    formHtml.AppendLine($"<label for=\"{column.ColumnName}\">{column.ColumnName}</label>");
                    formHtml.AppendLine($"<div class=\"input-group date\" id=\"reservationdatetime\" data-target-input=\"nearest\" >");
                    formHtml.AppendLine($"<input type=\"text\" id=\"{column.ColumnName}\" class=\"form-control datetimepicker-input\" data-target=\"#reservationdatetime\" />");
                    formHtml.AppendLine($"<div class=\"input-group-append\" data-target=\"#reservationdatetime\" data-toggle=\"datetimepicker\">");
                    formHtml.AppendLine($"<div class=\"input-group-text\" ><i class=\"fa fa-calendar\" ></i></div>");
                    formHtml.AppendLine($"</div>");
                    formHtml.AppendLine($"</div>");
                }
                else
                {
                    formHtml.AppendLine($"<label for=\"{column.ColumnName}\">{column.ColumnName}</label>");
                    formHtml.AppendLine($"<input type=\"text\" class=\"form-control\" id=\"{column.ColumnName}\" name=\"{column.ColumnName}\" />");
                }
               
            }
            formHtml.AppendLine("</form>");
            return formHtml.ToString();
        }

        public class TableSchema
        {
            public string ColumnName { get; set; }
            public string DataType { get; set; }
        }

Bence formu persist etmeye gerek yok, her defasinda yeniden olusturabilirsin.
Ama illa kaydedecegim diyorsan ayri bir table olusturup kaydedebilirsin.
Kod:
create table module_ui ,

pk varchar, text vs-> module_table_name

html_form lob, largeText -> "olusturdugun_form"
 

Technopat Haberler

Geri
Yukarı