PDA

View Full Version : سوال: مشکل در ویرایش رکورد ها



neda_dela
جمعه 22 آبان 1388, 10:45 صبح
سلام دوستان
من می خوام رکوردهای بانکم رو ویرایش کنم ولی به مشکل برخوردم. من یه گرید دارم که رکورد ها رو توش نشون میده و وقتی که رکوردی رو از توش انتخاب می کنم اطلاعات فیلدهای اون توی کنترل های موجود در پایین صفحه نشون داده میشه تا من بتونم اونا رو ویرایش کنم. من کد ثبت رو برای ویرایش هم کپی کردم و توش تغییراتی دادم اما دیگه نمی دونم باید چه کار کنم. این کد ثبت رکورد بوده:


try
{
this.st_shakhsiTableAdapter.Fill(this.quranDataSet ._st_shakhsi);
SqlDataAdapter da = new SqlDataAdapter();
da.InsertCommand = new SqlCommand();
da.InsertCommand.Connection = myConnection;
string query = "insert into [st-shakhsi](tarikh,firstname,lastname,fname,fjob,mname,mjob,b irthday,pic)values(@date,@fname,@lname,@fnme,@jf,@ mnme,@jm,@bdate,@i)";
da.InsertCommand.CommandText = query;
da.InsertCommand.Parameters.AddWithValue("@date", maskedTextBox1.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@fname", textBox2.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@lname", textBox15.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@fnme", textBox7.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@jf", textBox6.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@mnme", textBox4.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@jm", textBox5.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@bdate", maskedTextBox2.Text.Trim());
System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open);
byte[] imagecontent = new byte[fs.Length];
fs.Read(imagecontent, 0, (int)fs.Length);
SqlParameter ping = new SqlParameter("@i", imagecontent);
ping.SqlDbType = SqlDbType.Image;
da.InsertCommand.Parameters.Add(ping);
myConnection.Open();
da.InsertCommand.ExecuteNonQuery();
myConnection.Close();
rookhani_Load(sender,e);
MessageBox.Show("طلاعات با موفقیت ثبت شد");
textBox2.Text="";
textBox15.Text="";
textBox7.Text="";
textBox6.Text="";
textBox4.Text="";
textBox5.Text="";
maskedTextBox2.Text = "";

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}


و حالا این هم کد ویرایش که خطا میده:


try
{
this.st_shakhsiTableAdapter.Fill(this.quranDataSet ._st_shakhsi);
SqlDataAdapter da = new SqlDataAdapter();
da.InsertCommand = new SqlCommand();
da.InsertCommand.Connection = myConnection;
string a = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
string query = "update [st-shakhsi]set(tarikh,firstname,lastname,fname,fjob,mname,mjo b,birthday,pic)values(@date,@fname,@lname,@fnme,@j f,@mnme,@jm,@bdate,@i)where id='"+Convert.ToInt64(a)+"'";
da.InsertCommand.CommandText = query;
da.InsertCommand.Parameters.AddWithValue("@date", maskedTextBox1.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@fname", textBox1.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@lname", textBox15.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@fnme", textBox2.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@jf", textBox3.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@mnme", textBox4.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@jm", textBox5.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@bdate", maskedTextBox2.Text.Trim());
System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open);
byte[] imagecontent = new byte[fs.Length];
fs.Read(imagecontent, 0, (int)fs.Length);
SqlParameter ping = new SqlParameter("@i", imagecontent);
ping.SqlDbType = SqlDbType.Image;
da.InsertCommand.Parameters.Add(ping);
myConnection.Open();
da.InsertCommand.ExecuteNonQuery();
myConnection.Close();
sabtst_Load(sender,e);
MessageBox.Show("اطلاعات با موفقیت ویرایش شد");

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}


وقتی که برنامه رو trace می کنم با F9 توی خط :

System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open);


به قسمت catch میره و این خطا رو میده :


Path cannot be null.
Parameter name:path

که مسلما به خاطر اینه که من عکسی رو open نکردم و این عکسی که توی پیکچر باکس هستش با انتخاب رکورد از گرید توی اون ظاهر شده. ولی نمی دونم باید چه دستوری رو استفاده کنم. خواهشا اگه کسی می تونه کمکم کنه مرسی

neda_dela
جمعه 22 آبان 1388, 18:02 عصر
سلام دوستان



من می خوام رکوردهای بانکم رو ویرایش کنم ولی به مشکل برخوردم. من یه گرید دارم که رکورد ها رو توش نشون میده و وقتی که رکوردی رو از توش انتخاب می کنم اطلاعات فیلدهای اون توی کنترل های موجود در پایین صفحه نشون داده میشه تا من بتونم اونا رو ویرایش کنم. من کد ثبت رو برای ویرایش هم کپی کردم و توش تغییراتی دادم اما دیگه نمی دونم باید چه کار کنم. این کد ثبت رکورد بوده:


try
{
this.st_shakhsiTableAdapter.Fill(this.quranDataSet ._st_shakhsi);
SqlDataAdapter da = newSqlDataAdapter();
da.InsertCommand = newSqlCommand();
da.InsertCommand.Connection = myConnection;
string query = "insert into [st-shakhsi](tarikh,firstname,lastname,fname,fjob,mname,mjob,b irthday,pic)values(@date,@fname,@lname,@fnme,@jf,@ mnme,@jm,@bdate,@i)";
da.InsertCommand.CommandText = query;
da.InsertCommand.Parameters.AddWithValue("@date", maskedTextBox1.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@fname", textBox2.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@lname", textBox15.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@fnme", textBox7.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@jf", textBox6.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@mnme", textBox4.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@jm", textBox5.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@bdate", maskedTextBox2.Text.Trim());
System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open);
byte[] imagecontent = newbyte[fs.Length];
fs.Read(imagecontent, 0, (int)fs.Length);
SqlParameter ping = newSqlParameter("@i", imagecontent);
ping.SqlDbType = SqlDbType.Image;
da.InsertCommand.Parameters.Add(ping);
myConnection.Open();
da.InsertCommand.ExecuteNonQuery();
myConnection.Close();
rookhani_Load(sender,e);
MessageBox.Show("طلاعات با موفقیت ثبت شد");
textBox2.Text="";
textBox15.Text="";
textBox7.Text="";
textBox6.Text="";
textBox4.Text="";
textBox5.Text="";
maskedTextBox2.Text = "";

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}


و حالا این هم کد ویرایش که خطا میده:


try
{
this.st_shakhsiTableAdapter.Fill(this.quranDataSet ._st_shakhsi);
SqlDataAdapter da = newSqlDataAdapter();
da.InsertCommand = newSqlCommand();
da.InsertCommand.Connection = myConnection;
string a = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
string query = "update [st-shakhsi]set(tarikh,firstname,lastname,fname,fjob,mname,mjo b,birthday,pic)values(@date,@fname,@lname,@fnme,@j f,@mnme,@jm,@bdate,@i)where id='"+Convert.ToInt64(a)+"'";
da.InsertCommand.CommandText = query;
da.InsertCommand.Parameters.AddWithValue("@date", maskedTextBox1.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@fname", textBox1.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@lname", textBox15.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@fnme", textBox2.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@jf", textBox3.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@mnme", textBox4.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@jm", textBox5.Text.Trim());
da.InsertCommand.Parameters.AddWithValue("@bdate", maskedTextBox2.Text.Trim());
System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open);
byte[] imagecontent = newbyte[fs.Length];
fs.Read(imagecontent, 0, (int)fs.Length);
SqlParameter ping = newSqlParameter("@i", imagecontent);
ping.SqlDbType = SqlDbType.Image;
da.InsertCommand.Parameters.Add(ping);
myConnection.Open();
da.InsertCommand.ExecuteNonQuery();
myConnection.Close();
sabtst_Load(sender,e);
MessageBox.Show("اطلاعات با موفقیت ویرایش شد");

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}


وقتی که برنامه رو trace می کنم با F9 توی خط :

System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open);



به قسمت catch میره و این خطا رو میده :


که مسلما به خاطر اینه که من عکسی رو open نکردم و این عکسی که توی پیکچر باکس هستش با انتخاب رکورد از گرید توی اون ظاهر شده. ولی نمی دونم باید چه دستوری رو استفاده کنم. خواهشا اگه کسی می تونه کمکم کنه مرسی

آیا کسی هست که مرا یاری کند؟
این هم کد زمانی که یه رکورد رو انتخاب می کنم تا اطلاعات اون داخل کنترل های مربوطه بشینه. که درست البته عمل می کنه فقط گذاشتم تا ببینید


private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
textBox1.Text = dataGridView1.CurrentRow.Cells[1].Value.ToString();
textBox15.Text = dataGridView1.CurrentRow.Cells[2].Value.ToString();
maskedTextBox2.Text = dataGridView1.CurrentRow.Cells[3].Value.ToString();
maskedTextBox1.Text = dataGridView1.CurrentRow.Cells[4].Value.ToString();
textBox2.Text = dataGridView1.CurrentRow.Cells[5].Value.ToString();
textBox3.Text = dataGridView1.CurrentRow.Cells[6].Value.ToString();
textBox4.Text = dataGridView1.CurrentRow.Cells[7].Value.ToString();
textBox5.Text = dataGridView1.CurrentRow.Cells[8].Value.ToString();
pictureBox1.Image = Image.FromStream(new MemoryStream((byte[])(dataGridView1.SelectedRows[0].Cells["pic"].Value)));
}
}

ali_md110
جمعه 22 آبان 1388, 19:06 عصر
دستور اسکیول Update شما صحیح نیست اونو تغییر بدید
مثل :

UPDATE Table2
SET col1 = 1, col2 = 1
WHERE (col2 = 1)

neda_dela
جمعه 22 آبان 1388, 21:58 عصر
دستور اسکیول Update شما صحیح نیست اونو تغییر بدید
مثل :

UPDATE Table2
SET col1 = 1, col2 = 1
WHERE (col2 = 1)
من این کار رو انجام دادم البته تا نصفه برای فیلد pic یا همون عکس موندم چی کار کنم


string query = "update [st-shakhsi]set(tarikh='"+maskedTextBox1.Text+"',firstname='"+textBox1.Text+"',lastname='"+textBox15.Text+"',fname='"+textBox2.Text+"',fjob='"+textBox3.Text+"',mname='"+textBox4.Text+"',mjob='"+textBox5+"',birthday='"+maskedTextBox2.Text+"',pic='"+pictureBox1.+"')where id='"+Convert.ToInt64(a)+"'";


picturebox.???

در ضمن به نظرتون این دستورات رو نباید تغییر بدم ؟


System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open);
byte[] imagecontent = new byte[fs.Length];
fs.Read(imagecontent, 0, (int)fs.Length);
SqlParameter ping = new SqlParameter("@i", imagecontent);
ping.SqlDbType = SqlDbType.Image;
da.InsertCommand.Parameters.Add(ping);

ali_md110
شنبه 23 آبان 1388, 00:20 صبح
سلام
تا اونجایی که امکان داره برای درج یا ویرایش رکورد از ارسال پارامتر استفاده کنید چون بکارگیری کنترلها توی دستورات اسکیول بعضی وقتها با فارسی مشکل داره
کد زیر رو نگاه کن راهنماییتون میکنه

public void updatepic()
{
MemoryStream ms = new MemoryStream();
try
{

PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat);
}
catch (Exception exc)
{
MessageBox.Show("تصوير مناسب را انتخاب کنيد");
return;
}

byte[] arrayImage = ms.GetBuffer();
ms.Close();
con.Open();
string strSQL = "UPDATE Actors SET Fname = @NAME, Lname = @LNAME, pic = @PIC WHERE (ActID = @ActID)";
SqlCommand cmd = new SqlCommand(strSQL, con);
cmd.Parameters.Add("@ActID", SqlDbType.VarChar, 50).Value = (TXTID.Text);
cmd.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = TextBox1.Text;
cmd.Parameters.Add("@lname", SqlDbType.VarChar, 50).Value = TextBox1.Text;
cmd.Parameters.Add("@Pic", SqlDbType.Image).Value = arrayImage;
cmd.ExecuteNonQuery();
con.Close();
}

neda_dela
شنبه 23 آبان 1388, 10:10 صبح
سلام
تا اونجایی که امکان داره برای درج یا ویرایش رکورد از ارسال پارامتر استفاده کنید چون بکارگیری کنترلها توی دستورات اسکیول بعضی وقتها با فارسی مشکل داره
کد زیر رو نگاه کن راهنماییتون میکنه

public void updatepic()
{
MemoryStream ms = new MemoryStream();
try
{

PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat);
}
catch (Exception exc)
{
MessageBox.Show("تصوير مناسب را انتخاب کنيد");
return;
}

byte[] arrayImage = ms.GetBuffer();
ms.Close();
con.Open();
string strSQL = "UPDATE Actors SET Fname = @NAME, Lname = @LNAME, pic = @PIC WHERE (ActID = @ActID)";
SqlCommand cmd = new SqlCommand(strSQL, con);
cmd.Parameters.Add("@ActID", SqlDbType.VarChar, 50).Value = (TXTID.Text);
cmd.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = TextBox1.Text;
cmd.Parameters.Add("@lname", SqlDbType.VarChar, 50).Value = TextBox1.Text;
cmd.Parameters.Add("@Pic", SqlDbType.Image).Value = arrayImage;
cmd.ExecuteNonQuery();
con.Close();
}
ممنون از پاسختون
بله من قبلا به مشکل کاراکتر های فارسی و عربی بر خورده بودم و زمانی که مقداری رو که توش حرف ی داشت رو سرچ می کردم نشون نمی داد چون توی بانکم ی با دو تا نقطه زیرش ذخیره می شد. برای رفع این مشکل توی دستور insert اس کیو الم از حرف N برای مقدار هر فیلد استفاده کردم و درست شد.
اما خب چطوری میشه از کنترل ها استفاده نکرد؟ توی کدی که شما گذاشتین برنامه از کجاباید بفهمه که مثلا مقدار جدید فیلد نام رو باید از توی تکست باکس بخونه؟
و اما کدی که گذاشتین :
من نفهمیدم که این تابع رو باید کجا قرار بدم ، گذاشتمش توی رویداد کلیک دکمه ثبت تغییرات توی فرم ویرایش رکورد هام. یعنی این کد:


private void BTNedit_Click(object sender, EventArgs e)
{
try
{
this.st_shakhsiTableAdapter.Fill(this.quranDataSet ._st_shakhsi);
MemoryStream ms = new MemoryStream();
try
{
pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
}
catch (Exception exc)
{
MessageBox.Show("¢­يï© êëں« ©ں ں뢦ں کëï§");
return;
}
byte[] arrayImage = ms.GetBuffer();
ms.Close();
myConnection.Open();
string a = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
string query = "update [st-shakhsi]set(tarikh=@date,firstname=@fname,lastname=@lname, fname=@fnme,fjob=@jf,mname=@mnme,mjob=@jm,birthday =@bdate,pic=@pic)where (id=@id)";
SqlCommand cmd = new SqlCommand(query,myConnection);
cmd.Parameters.Add("@id", SqlDbType.BigInt,8);
cmd.Parameters.Add("@date", SqlDbType.Text, 16);
cmd.Parameters.Add("@fname", SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@lname", SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@fnme", SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@jf", SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@mnme", SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@jm", SqlDbType.NVarChar, 50);
cmd.Parameters.Add("@@bdate", SqlDbType.Text, 16);
cmd.Parameters.Add("@Pic", SqlDbType.Image).Value = arrayImage;
cmd.ExecuteNonQuery();
myConnection.Close();
sabtst_Load(sender,e);
MessageBox.Show("ںلéںمں¢ ں êيهçی¢ يی©ںی¬ ¬§");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

}

ولی خطا داد . وقتی برنامه رو تریس می کنم از خط :


cmd.ExecuteNonQuery();

می ره به catch و این خطا رو میده:

Line1: Incorrect syntax near'('.

ali_md110
یک شنبه 24 آبان 1388, 00:33 صبح
دوست من شما پارامترها رو بدون مقدار ارسال کردید

cmd.Parameters.Add("@id", SqlDbType.BigInt,8);
باید اونو به یک متغیر یا یک کنترل داده رو به اون پاس کنید مثل:

cmd.Parameters.Add("@ActID", SqlDbType.VarChar, 50).Value = (TXTID.Text);

اون کدی که نوشتم کافیه صداش بزنید حالا توی دکمه باشه یا هر رویداد دیکه
منظور من از استفاده نکردن کنترلها فقط توی دستورات اسکیول هستش نه ارسال پارامترها

در ضمن پیام اخری مربوط به غلط املایی شماست
دستور اسکیول شما غلط داره

string query = "update [st-shakhsi]set(tarikh=@date,firstname=@fname,lastname=@lname, fname=@fnme,fjob=@jf,mname=@mnme,mjob=@jm,birthday =@bdate,pic=@pic)where (id=@id)";
پرانتز بعد از set رو حذف کنید

string query = "update [st-shakhsi]set tarikh=@date,firstname=@fname,lastname=@lname,fnam e=@fnme,fjob=@jf,mname=@mnme,mjob=@jm,birthday=@bd ate,pic=@pic where (id=@id)";

neda_dela
یک شنبه 24 آبان 1388, 22:19 عصر
دوست من شما پارامترها رو بدون مقدار ارسال کردید

cmd.Parameters.Add("@id", SqlDbType.BigInt,8);
باید اونو به یک متغیر یا یک کنترل داده رو به اون پاس کنید مثل:

cmd.Parameters.Add("@ActID", SqlDbType.VarChar, 50).Value = (TXTID.Text);

اون کدی که نوشتم کافیه صداش بزنید حالا توی دکمه باشه یا هر رویداد دیکه
منظور من از استفاده نکردن کنترلها فقط توی دستورات اسکیول هستش نه ارسال پارامترها

در ضمن پیام اخری مربوط به غلط املایی شماست
دستور اسکیول شما غلط داره

string query = "update [st-shakhsi]set(tarikh=@date,firstname=@fname,lastname=@lname, fname=@fnme,fjob=@jf,mname=@mnme,mjob=@jm,birthday =@bdate,pic=@pic)where (id=@id)";
پرانتز بعد از set رو حذف کنید

string query = "update [st-shakhsi]set tarikh=@date,firstname=@fname,lastname=@lname,fnam e=@fnme,fjob=@jf,mname=@mnme,mjob=@jm,birthday=@bd ate,pic=@pic where (id=@id)";
کدتون مشکلم رو حل کرد ممنون
من می خام وقتی که کار ویرایش تموم شد و از فرمم (فرم 2) خارج شدم هنگامی که فرم قبلی (فرم 1) ظاهر میشه تغییراتی که توی بانک دادم توی گرید موجود در فرم 1 هم همون لحظه نشون داده بشه اما در حال حاضر باید برنامه رو ببندم و دوباره اجرا کنم تا تغییرات رو ببینم
البته من قبلا به این مشکل بر خورده بودم ولی الان هر کدوم از دستوراتی رو که فکر کردم شاید جواب بده گذاشتم اما جواب نگرفتم مثلا توی رویداد کلیک دکمه خروج فرم 2 (که همون فرم ویرایش رکورد ها باشه ) این دستورات رو گذاشتم:


private void button2_Click(object sender, EventArgs e)
{
(new rookhani()).rookhani_Load(sender, e);
Close();
}

این طوری هم امتحان کردم:


private void button2_Click(object sender, EventArgs e)
{
rookhani rkh = new rookhani();
rkh.rookhani_Load(sender,e);
Close();
}

این دستورات رو توی رویداد form_closing و form_closed فرم 2 هم گذاشتم بازم جواب نگرفتم
من توی فرم 2 دیتا گرید فرم 1 رو رفرش کردم ، آپدیت کردم اما بازم جواب نگرفتم
اینا رو گفتم که نگین یه وقت خودم زحمت نمی کشم :خجالت:
منتظر کمک هاتون هستم

xxxxxxxxxx
دوشنبه 25 آبان 1388, 00:33 صبح
سلام .لزومي به اجراي متد load نيست .بلكه ميتونيد بين دو تا فرم (بين گريد ويو فرم 1و تكس باكس هاي فرم 2)از يك منبع اطلاعاتي استفاده كنيد.يعني gridview.datasource برابر با مثلا يك ديتا تيبل يا بك ديتا ويو يا يك باينديگ سورس قرار دهيدو‌آنوقت تغييرات حاصله از فرم 2 خود بخود در فرم 1 قابل نمايش است.البته براي insert يا update كردن اطلاعات بايت آن منبع اطلاعات را Updateكنيد .راحترين را استفاده از TableAdapterهست ولي خودتان هم مي توانيد با همين روش كه داريد (بشرط آنكه SourceColumn پارامتر ها را هم با نام فيلد ها تنظيم كنيد) ادامه دهيد مثلا از آن تيبل مشتر ك Getchaing()بگيريد و ركورهاي جديد را insertو ركودهاي تغيير يافته را updateكنيد.هم مي توانيد در يك حلقه يكي يكي ركوردها را به ذخيره كنيد هم مي توانيد بدون حلقه تيبل را ذخيره كنيد (البته با تنظيم SourceColumn پارامترها )البته ببخشيد عجله اي گفتم وبدون مثال وقت كم بود.راستي اينم بگم كه بعداز دخيره موفق تيبل تون براي تثبيت تغييرات جدولتو ن از متد acceptchang()استفاده كنيد.

ali_md110
دوشنبه 25 آبان 1388, 01:12 صبح
روشهای متفاوتی میتونید انجام بدید یکی از روشها اینه که یک کلاس بسازی و توی اون یک پروپرتیهای static تعریف کنید فرض کنیم کلاسی بانام global داریم

static string intID;
public static string productid
{
get
{
return intID;
}
set
{
intID = value;

}
}
این فیلد یک مقدار رشته ای رو توی خودش ذخیره میکنه
توی فرم دومتون یک تابع رشته ای بسارید با سطح دسترسی public

public string Returnid()
{
return (this.txtid.Text);
}

توی روال فرم لود میتونید پروپرتی که در کلاس globalتعریف کردید رو استفاده کنید بدین صورت

this.txtid.Text = (string)global.productid.ToString();
وقتی فرم لود میشه مقدار پروپرتی ریخته میشه توی تکست باکس
وقتی هم که تغییرات دادی توی نکست باکس و توی بانکت ذخیرش کردی توی دکمه خروج از فرم 2 مقدار پروپرتی رو برابر با مقدار تکست باکس بدید دقیقا بر عکس فرم لود

global.productid = (this.txtid.Text);
بعدش فرم رو هم ببندید

حالا باید توی فرم اول کد های زیر رو توی دکمه ای بزارید که باید فرم دوم رو نمایش بده

private void button6_Click(object sender, EventArgs e)
{
try
{
global.productid = (string)dataGridView1.CurrentRow.Cells[0].Value;

}
catch
{
MessageBox.Show("کالایی انتخاب نشده دیتاگراید را کلیک کنید");
return;
}
Form2 frm = new Form2();
frm.ShowDialog();
int intindex = dataGridView1.CurrentRow.Index;
dataGridView1[0, intindex].Value = frm.Returnid();

}
فرض اینه که روی دیتاگراید کلیک کنیم تا مقدار ستون اول دیتاگراید ریخته بشه توی پراپرتی که ساختیم

امیدوارم کمکتون بکنه
اگر سوالی داشتید من تا 4 روز دیگه نیستم پیام خصوصی بزارید

neda_dela
سه شنبه 26 آبان 1388, 22:19 عصر
روشهای متفاوتی میتونید انجام بدید یکی از روشها اینه که یک کلاس بسازی و توی اون یک پروپرتیهای static تعریف کنید فرض کنیم کلاسی بانام global داریم

static string intID;
public static string productid
{
get
{
return intID;
}
set
{
intID = value;

}
}
این فیلد یک مقدار رشته ای رو توی خودش ذخیره میکنه
توی فرم دومتون یک تابع رشته ای بسارید با سطح دسترسی public

public string Returnid()
{
return (this.txtid.Text);
}
توی روال فرم لود میتونید پروپرتی که در کلاس globalتعریف کردید رو استفاده کنید بدین صورت

this.txtid.Text = (string)global.productid.ToString();
وقتی فرم لود میشه مقدار پروپرتی ریخته میشه توی تکست باکس
وقتی هم که تغییرات دادی توی نکست باکس و توی بانکت ذخیرش کردی توی دکمه خروج از فرم 2 مقدار پروپرتی رو برابر با مقدار تکست باکس بدید دقیقا بر عکس فرم لود

global.productid = (this.txtid.Text);
بعدش فرم رو هم ببندید

حالا باید توی فرم اول کد های زیر رو توی دکمه ای بزارید که باید فرم دوم رو نمایش بده

private void button6_Click(object sender, EventArgs e)
{
try
{
global.productid = (string)dataGridView1.CurrentRow.Cells[0].Value;

}
catch
{
MessageBox.Show("کالایی انتخاب نشده دیتاگراید را کلیک کنید");
return;
}
Form2 frm = new Form2();
frm.ShowDialog();
int intindex = dataGridView1.CurrentRow.Index;
dataGridView1[0, intindex].Value = frm.Returnid();

}
فرض اینه که روی دیتاگراید کلیک کنیم تا مقدار ستون اول دیتاگراید ریخته بشه توی پراپرتی که ساختیم

امیدوارم کمکتون بکنه
اگر سوالی داشتید من تا 4 روز دیگه نیستم پیام خصوصی بزارید



من کلاسی رو که گفتین این طوری ساختم:


using System;
using System.Collections.Generic;
using System.Text;
namespace quran
{
class update
{
static string intID;
public static string productid
{
get
{
return intID;
}
set
{
intID = value;
}
}
}
}


تابعی که گفته بودین تو فرم دوم بسازم رو این طوری نوشتم: (فقط من چون توی دیزاین فرمم به ازای id تکست باکسی در نظر نگرفتم اینجا هم از گرید استفاده کردم)

string id;
public string Returnid()
{
id = this.dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
return (id);
}

و توی روال فرم لود همون فرم 2 این طوری ازش استفاده کردم


private void sabtst_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'quranDataSet._st_shakhsi' table. You can move, or remove it, as needed.
this.st_shakhsiTableAdapter.Fill(this.quranDataSet ._st_shakhsi);
ClsLang lng = new ClsLang();
lng.farsi();
try
{
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = myConnection;
da.SelectCommand.CommandText = "select id,firstname,lastname,birthday,tarikh,fname,fjob,m name,mjob,pic from [st-shakhsi]";
da.FillSchema(objset, SchemaType.Source, "quran1");
da.Fill(objset, "quran1");
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = objset;
dataGridView1.DataMember = "quran1";
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView1.MultiSelect = false;
dataGridView1.Columns[0].HeaderText = "ک§";
dataGridView1.Columns[1].HeaderText = "ëںê ";
dataGridView1.Columns[2].HeaderText = "ëںê ¦ںëيں§گی";
dataGridView1.Columns[3].HeaderText = "¢ں©ی¦ ¢يé§";
dataGridView1.Columns[4].HeaderText = "¢ں©ی¦ £ ¢ ëںê";
dataGridView1.Columns[5].HeaderText = "ëںê پ§©";
dataGridView1.Columns[6].HeaderText = "¬نé پ§©";
dataGridView1.Columns[7].HeaderText = "ëںê êں§©";
dataGridView1.Columns[8].HeaderText = "¬نé êں§©";
dataGridView1.Columns[9].HeaderText = "مک«";
dataGridView1.Columns[0].Width = 50;
dataGridView1.Columns[1].Width = 85;
dataGridView1.Columns[4].Width = 64;
dataGridView1.Columns[3].Width = 64;
foreach (DataGridViewRow dgvr in dataGridView1.Rows)
dgvr.Height = 113;
update.productid = (string)dataGridView1.CurrentRow.Cells[0].Value.ToString();
this.id = update.productid;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

}

و توی دکمه خروج فرم2 اینو نوشتم:


private void button2_Click(object sender, EventArgs e)
{
update.productid = this.id;
Close();
}


توی فرم 1 هم من از طریق منو فرم 2 رو فراخونی می کنم این طوری:


private void ToolStripMenuItem3_Click(object sender, EventArgs e)
{
sabtst sbt = new sabtst();
sbt.ShowDialog();
int intindex = Convert.ToInt32(sbt.Returnid());
dataGridView1[0, intindex].Value = sbt.Returnid();

}


حالا بازم مشکل حل نشده وقتی برنامه رو تریس می کنم توی این خط خطا میده:

dataGridView1[0, intindex].Value = sbt.Returnid();


خطاش هم اینه :


Index was out of range. Must be non-negative and less than the size out of collection.
Parameter name:index

ali_md110
شنبه 30 آبان 1388, 22:30 عصر
این مثال نگاه کن