C#.NET

SkyDriver

Would like my bananna ?
Член од
31 јули 2008
Мислења
2.140
Поени од реакции
221
Мислиш во DataGridView-от ги вчитуваш податоците од база и потоа сакаш дирекно во самиот DataGridView да ги менуваш и да ги зачуваш повторно во база заедно со нивните променли или... ?

Ако го сакаш тоа првото, ондак или користи DataSet или некоја од останатите алатки за комуникација со базата или пак по промените измини го цел DataGridView со foreach и обнови ги записите во базата, а ако мислеше за нешто друго, кажи за што точно мислеше дека вака незнам што точно ти треба, ти прашуваш за промена на податоците на DataGridView што е овозможено под дифолт. :toe:
 
Член од
15 јули 2008
Мислења
26
Поени од реакции
0
Дали може некако да се овозможи промена на податоците во DataGridView компонетата која ја има во C# десктоп апликација и не е слична со GridView-то од C#.Net, ако не посоти начин за едитирање преку DataGridView, тогаш мора да има некој друг, па дали некој може да помогне?

http://www.codeproject.com/KB/grid/Editable_GridView.aspx
 
Член од
5 август 2006
Мислења
163
Поени од реакции
8
Мислиш во DataGridView-от ги вчитуваш податоците од база и потоа сакаш дирекно во самиот DataGridView да ги менуваш и да ги зачуваш повторно во база заедно со нивните променли или... ?:
Мислам на ова, но не знам точно како би одело.
 

SkyDriver

Would like my bananna ?
Член од
31 јули 2008
Мислења
2.140
Поени од реакции
221
Вака, малце посложено е тоа да се објасни вака на форум со еден пост, али на памет вака некако ќе му дојде:

Код:
using System.Data.SqlClient;

// Декларирање на DataSet
private DataSet ds;
// Декларирање на DataAdapter
private SqlDataAdapter adap;
// Декларирање конекција
private SqlConnection con;

// Тука кодот за конекција со базата и слично

// Лоадирање на податоците од базата
adap = new SqlDataAdapter("select * from tableName", con);
ds = new DataSet();
adap.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];

// Апдејтување на податоците во базата
SqlCommandBuilder com = new SqlCommandBuilder(adap);
foreach(DataRow dr in ds.Tables[0].Rows) {
dr["imeNaKolona"] = txtText.Text;
}
adap.Update(ds);
Едит: Разгледај го и овој пост.

Е сега вака незнам колку би можел да сватиш, разгледај ги класите за DataSet и DataAdapter (исто така мислам дека и BindingNavigator и BindingSource можеш да ги искористиш затоа што BindingNavigator-от има интегрирана функција за апдејт на податоците), како и да е, барем за C#.NET можеш едно чудо туторијали на гугл да најдеш за ова.

Исто така имаш друга опција, преку Server Explorer-от да направиш конекција и потоа со Drag & Drop земи ја конекцијата од Server Explorer-от и постави ја во Windows App и автоматски ќе ти се генерираат DataGridView и некои останати компоненти за комуникција со базата, таму е вклучен и BindingNavigator-от и ја има таа опција за апдејтување на податоците со клик на „Save“ дугмето кое исто така ќе биде автоматски генерирано.

Незнам ова колку ти помогна, но незнам како би можел во еден пост да го објаснам сето ова подетално. Разгледај ги значи класите од компонентите за комуникација со базата на MSDN и потоа мислам дека не би требало да имаш проблеми, ако некаде запнеш пиши, па ќе бараме чаре. :toe:
 

deXterche

тадаммм
Член од
12 февруари 2006
Мислења
4.920
Поени од реакции
941
Вака, малце посложено е тоа да се објасни вака на форум со еден пост, али на памет вака некако ќе му дојде:

Код:
using System.Data.SqlClient;

// Декларирање на DataSet
private DataSet ds;
// Декларирање на DataAdapter
private SqlDataAdapter adap;
// Декларирање конекција
private SqlConnection con;

// Тука кодот за конекција со базата и слично

// Лоадирање на податоците од базата
adap = new SqlDataAdapter("select * from tableName", con);
ds = new DataSet();
adap.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];

// Апдејтување на податоците во базата
SqlCommandBuilder com = new SqlCommandBuilder(adap);
foreach(DataRow dr in ds.Tables[0].Rows) {
dr["imeNaKolona"] = txtText.Text;
}
adap.Update(ds);
Едит: Разгледај го и овој пост.

Е сега вака незнам колку би можел да сватиш, разгледај ги класите за DataSet и DataAdapter (исто така мислам дека и BindingNavigator и BindingSource можеш да ги искористиш затоа што BindingNavigator-от има интегрирана функција за апдејт на податоците), како и да е, барем за C#.NET можеш едно чудо туторијали на гугл да најдеш за ова.

Исто така имаш друга опција, преку Server Explorer-от да направиш конекција и потоа со Drag & Drop земи ја конекцијата од Server Explorer-от и постави ја во Windows App и автоматски ќе ти се генерираат DataGridView и некои останати компоненти за комуникција со базата, таму е вклучен и BindingNavigator-от и ја има таа опција за апдејтување на податоците со клик на „Save“ дугмето кое исто така ќе биде автоматски генерирано.

Незнам ова колку ти помогна, но незнам како би можел во еден пост да го објаснам сето ова подетално. Разгледај ги значи класите од компонентите за комуникација со базата на MSDN и потоа мислам дека не би требало да имаш проблеми, ако некаде запнеш пиши, па ќе бараме чаре. :toe:
Off topic
Колку е ова поедноставно во PHP :)
 
Член од
5 август 2006
Мислења
163
Поени од реакции
8
Вака, малце посложено е тоа да се објасни вака на форум со еден пост, али на памет вака некако ќе му дојде:

Код:
using System.Data.SqlClient;

// Декларирање на DataSet
private DataSet ds;
// Декларирање на DataAdapter
private SqlDataAdapter adap;
// Декларирање конекција
private SqlConnection con;

// Тука кодот за конекција со базата и слично

// Лоадирање на податоците од базата
adap = new SqlDataAdapter("select * from tableName", con);
ds = new DataSet();
adap.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];

// Апдејтување на податоците во базата
SqlCommandBuilder com = new SqlCommandBuilder(adap);
foreach(DataRow dr in ds.Tables[0].Rows) {
dr["imeNaKolona"] = txtText.Text;
}
adap.Update(ds);
Едит: Разгледај го и овој пост.

Е сега вака незнам колку би можел да сватиш, разгледај ги класите за DataSet и DataAdapter (исто така мислам дека и BindingNavigator и BindingSource можеш да ги искористиш затоа што BindingNavigator-от има интегрирана функција за апдејт на податоците), како и да е, барем за C#.NET можеш едно чудо туторијали на гугл да најдеш за ова.

Исто така имаш друга опција, преку Server Explorer-от да направиш конекција и потоа со Drag & Drop земи ја конекцијата од Server Explorer-от и постави ја во Windows App и автоматски ќе ти се генерираат DataGridView и некои останати компоненти за комуникција со базата, таму е вклучен и BindingNavigator-от и ја има таа опција за апдејтување на податоците со клик на „Save“ дугмето кое исто така ќе биде автоматски генерирано.

Незнам ова колку ти помогна, но незнам како би можел во еден пост да го објаснам сето ова подетално. Разгледај ги значи класите од компонентите за комуникација со базата на MSDN и потоа мислам дека не би требало да имаш проблеми, ако некаде запнеш пиши, па ќе бараме чаре. :toe:
Вака јас ова го имам направено мене dataGridView-то ми се полни со податоците од базата, но тоа што сакам да направам е да може да се направи промена на податоците на базата со користење на оваа компонента, нешто слично како и кај компонентата DataGrid во ASP.NET каде на секој ред имаш опција уреди и со неково кликање се овозможува уредување на соодветниот ред, меѓутоа кај DataGridView ваква можност не постои, но мора да има и друг начин.
 

SkyDriver

Would like my bananna ?
Член од
31 јули 2008
Мислења
2.140
Поени од реакции
221
Вака јас ова го имам направено мене dataGridView-то ми се полни со податоците од базата, но тоа што сакам да направам е да може да се направи промена на податоците на базата со користење на оваа компонента, нешто слично како и кај компонентата DataGrid во ASP.NET каде на секој ред имаш опција уреди и со неково кликање се овозможува уредување на соодветниот ред, меѓутоа кај DataGridView ваква можност не постои, но мора да има и друг начин.
Епа друже ондак еве го решението. :)

Значи DataGridView-от ќе го полниш со „public void loadDataGrid(string sqlQueryString)“ функцијата и како што ќе се полни DataGridView-от така на секој ред се додаваат дугмиња „Промени“ и „Бриши“ (ако сакаш тоа „Бриши“ можеш да го тргнеш).
Е сега, за промената на детали, можеш да направиш во друга форма да се пренесат податоците и таму да се изврши промената или пак можеш во самиот DataGridView.
Треба да имаш една колона за ID каде што visible ќе и биде false и после на OnClick евентот се ориентираш по index-от односно ID-то на записот.

OnLoad
public void loadDataGrid("select * from tablename order by id desc")

И потоа во Search Bar-от (доколку имаш опција за преарување) правиш кверија и само ја повикуваш функацијата со кверито и DataGridView-от се полни соодветно со кверито.

Еве ти едно видео да видиш како работи тој код:
(DataGridView-от се полни со „loadDataGrid“ а кверијата се во евентот OnChange на текст боксот за пребарување).


Едит: Еве го и кодот за евентот при притискање на дугмето „Промени“ (за HomeDVD програмата).

Код:
if (dataGridView1.Columns[e.ColumnIndex] == editButton && currentRow >= 0)
{
// Вчитување на податоците од редот каде што е кликнат „Промени“...
int id = parseInt(dataGridView1[0, currentRow].Value.ToString());
string title = dataGridView1[1, currentRow].Value.ToString();
string publisher = dataGridView1[2, currentRow].Value.ToString();
string previewed = dataGridView1[3, currentRow].Value.ToString();
string year = dataGridView1[4, currentRow].Value.ToString();
string type = dataGridView1[5, currentRow].Value.ToString();
                
// Пренесување на податоците во друга форма каде што ќе се изврши промената
// Претходно во новата форма се декларирани променливите
Form3 f3 = new Form3();
f3.id = id;
f3.title = title;
f3.publisher = publisher;
f3.previewed = previewed;
f3.year = year;
f3.type = type;
f3.Show();
dataGridView1.Update();
}
Значи доколку сакаш можеш вака да ги пренесеш податоците или пак во самиот DataGridView изврши ја промената со едно квери update tableName set column = value, column = value... where id = idOdZapisot.
 
Член од
5 август 2006
Мислења
163
Поени од реакции
8
ОК, фала многу, се надевам ќе се снајдам.
 
Член од
5 август 2006
Мислења
163
Поени од реакции
8
А како да ставам event на копчето Промени од dataGridView?
 

SkyDriver

Would like my bananna ?
Член од
31 јули 2008
Мислења
2.140
Поени од реакции
221
А како да ставам event на копчето Промени од dataGridView?
Во DataGridView-от има евент „CellContentClick“, во тој евент ќе го пишеш кодот, само ќе ставиш услов:

Код:
if (dataGridView1.Columns[e.ColumnIndex] == editButton && currentRow >= 0) {
// тука кодот кој треба да се изврши кога ќе биде притиснато дугмето
}
// editButton = името на променливата за дугмето
// currentRow = e.RowIndex
 
Член од
5 август 2006
Мислења
163
Поени од реакции
8
А на кој начин се одвива Update на означениот ред, пробав со следниов код, ми вика не можело да се конверитра, а исто и параметрите не примаат tb.Text, еве го кодот што го напишав но изгледа не работи вака:

if (dataGridView1.Columns[e.ColumnIndex] == editButton && e.RowIndex >= 0)
{
SqlConnection konekcija = new SqlConnection();
konekcija.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\StandardiSQL.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
string sql = "UPDATE Standardi SET [Broj_na_proekt]=@br WHERE [Reden_broj]=@id";
SqlCommand komanda = new SqlCommand(sql, konekcija);

TextBox tb = (TextBox)dataGridView1[2, e.RowIndex].Value.ToString();
komanda.Parameters.Add("@br", tb.Text);
komanda.Parameters.Add("@id", dataGridView1[0, e.RowIndex].Value.ToString());

try
{
konekcija.Open();
komanda.ExecuteNonQuery();
}
catch
{

}
finally
{
konekcija.Close();

}
 

SkyDriver

Would like my bananna ?
Член од
31 јули 2008
Мислења
2.140
Поени од реакции
221
А на кој начин се одвива Update на означениот ред, пробав со следниов код, ми вика не можело да се конверитра, а исто и параметрите не примаат tb.Text, еве го кодот што го напишав но изгледа не работи вака:

Код:
if (dataGridView1.Columns[e.ColumnIndex] == editButton && e.RowIndex >= 0)
            {
                SqlConnection konekcija = new SqlConnection();
                konekcija.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\StandardiSQL.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
                string sql = "UPDATE Standardi SET [Broj_na_proekt]=@br WHERE [Reden_broj]=@id";
                SqlCommand komanda = new SqlCommand(sql, konekcija);

                [B]TextBox tb = (TextBox)dataGridView1[2, e.RowIndex].Value.ToString();[/B]
                komanda.Parameters.Add("@br", tb.Text);
                komanda.Parameters.Add("@id", dataGridView1[0, e.RowIndex].Value.ToString());

                try
                {
                    konekcija.Open();
                    komanda.ExecuteNonQuery();
                }
                catch 
                {
                    
                }
                finally
                {
                    konekcija.Close();
                    
                }
Грешката најверојатно ти е во болдираниот дел затоа што кога креираш текст бокс не му доделуваш вредност.

Вака мислам дека ќе му дојде:
Код:
TextBox tb = new TextBox(); // Креираш текст бокс
tb.Text = dataGridView1[2, e.RowIndex].Value.ToString(); // му доделуваш вредност
Али според мене мислам дека поедноставно би поминал вака:
Код:
komanda.Parameters.Add("@br", (string)dataGridView1[2, e.RowIndex].Value.ToString();
komanda.Parameters.Add("@id", (string)dataGridView1[0, e.RowIndex].Value.ToString());
Како и да е, стави го целиот код во Try-Catch услов и во Catch постави му да ти ја испечати евентуалната грешка за да знаеш каде грешиш:
Код:
try
{
// кодот
}
catch (Exception ex)
{
konekcija.Close();
MessageBox.Show(ex.Message.ToString());
}
Исто така не ќе е лошо да поставиш и вредностите кои ќе ги превземе од DataGridView-от да ти ги испечати заедно со кверито, за да имаш поголема прегледност на работата на кодот.

Пробај вака да видиш кои ерори ќе ти ги испечати за да знаеш точно каде грешиш, па ако не ја бива ни така пиши па ќе ја наредиме некако. :)
 
Член од
5 август 2006
Мислења
163
Поени од реакции
8
Сега е ок, не јавува грешки со тоа што ја направив само оваа промена:

komanda.Parameters.AddWithValue("@br", (string)dataGridView1[2, e.RowIndex].Value.ToString());
komanda.Parameters.AddWithValue("@id", (string)dataGridView1[0, e.RowIndex].Value.ToString());

Наместо методата Add, ја употребив AddWithValue, во лабела ги ставив вредностите за да видам дали точно се земаат од базата, но не сака да се сними, откако ке ја исклучам и повторно дебагирам и стартувам пак си останува истата база, без направената промена.
 

back_rest

ex mod coder
Член од
19 јули 2006
Мислења
1.590
Поени од реакции
107
Сега е ок, не јавува грешки со тоа што ја направив само оваа промена:

komanda.Parameters.AddWithValue("@br", (string)dataGridView1[2, e.RowIndex].Value.ToString());
komanda.Parameters.AddWithValue("@id", (string)dataGridView1[0, e.RowIndex].Value.ToString());

Наместо методата Add, ја употребив AddWithValue, во лабела ги ставив вредностите за да видам дали точно се земаат од базата, но не сака да се сними, откако ке ја исклучам и повторно дебагирам и стартувам пак си останува истата база, без направената промена.
А зошто кастуваш стринг во стринг? :)

Туку нејсе, харкодираните SqlConnection, SqlCommand и SqlParameter многу ми бодат очи. Чисто за совет понатака, користете ги основните класи: DbConnection, DbCommand, DbParameter. На тој начин, може да направите функции во стилот getNewConnection или getNewCommand кои во зависност од некои надворешни параметри ќе враќаат пример SqlConnection, OracleConnection, OdbcConnection или онаа за Sql Compact ... заборавив како и беше името. Муабетот ми е, дека вака ќе успеете да направите на некој начин Database инвариабилност, т.е. иста имплементација за различни бази на податоци.

Секако нели, LINQ или NHibernate се подобри, али сепак, вреди да се спомне.
 

SkyDriver

Would like my bananna ?
Член од
31 јули 2008
Мислења
2.140
Поени од реакции
221
Сега е ок, не јавува грешки со тоа што ја направив само оваа промена:

komanda.Parameters.AddWithValue("@br", (string)dataGridView1[2, e.RowIndex].Value.ToString());
komanda.Parameters.AddWithValue("@id", (string)dataGridView1[0, e.RowIndex].Value.ToString());

Наместо методата Add, ја употребив AddWithValue, во лабела ги ставив вредностите за да видам дали точно се земаат од базата, но не сака да се сними, откако ке ја исклучам и повторно дебагирам и стартувам пак си останува истата база, без направената промена.
Хмм... доколку конекцијата и кверито ти е во ред, ондак мора да се направат промените.
Вака напамет прво што би можел е да кажам дека имаш грешка во кверито, пробај вака:

Код:
// Провери какви се вредностите кои ги чита од DataGridView-от
MessageBox.Show("dataGridView1[2, e.RowIndex].Value.ToString() ->" + dataGridView1[2, e.RowIndex].Value.ToString());
MessageBox.Show("dataGridView1[0, e.RowIndex].Value.ToString() ->" + dataGridView1[0, e.RowIndex].Value.ToString());
// Види дали податоците што ќе ти ги испечати се оние соодветните
// Доколку не се, значи тука е грешката

// Наместо твоето квери, направи вака:
string sql = "UPDATE Standardi SET imeNaKolona=" + dataGridView1[2, e.RowIndex].Value.ToString() + " WHERE imeNaKolona=" + dataGridView1[0, e.RowIndex].Value.ToString();
// зборовите „imeNaKolona“ замени ги со твоите имиња на колони
MessageBox.Show(sql); // Провери го кверито дали е коректно
SqlCommand komanda = new SqlCommand(sql, konekcija);

// И сега, доколку го користиш мојот код за испишување на DataGridView-от
// Стави после извршувањето на кверито да се лоадира одново DataGridView-от
// За да ги видиш промените
loadDataGrid("select * from Standardi")
П.С. Можно е да сум направил синтаксички грешки затоа што кодов на памет го пишав, ама претпоставувам дека нема да имш проблем да ги средиш синтаксичките грешки.

Е сега, за тоа кога ќе ја исклучиш и дебагираш повторно програмата, доколку конекцијата ја правиш преку Visual Studio-то тогаш при секое дебагирање базата ќе си останува непроменета (во првобитна состојба, онака како што си ја додал во проектот), но како што гледам ти конекцијата ја правиш „рачно“, такада тоа мислам дека не би требало да биде проблем.
Значи како што ти кажав, доколку за испишување на DataGridView-от го користиш тој мојот код „loadDataGrid(sql)“ ондак после извршувањето на кверито постави одново „select * from Standardi“ за да се лоадира одново DataGridView-от и доколку се направиле промени ќе можеш да ги забележиш. :)
 

Kajgana Shop

На врв Bottom