با سلام دوباره
متد SelectedRows از DataGridView با متد Row اون متفاوت هست.
SelectedRows لیستی از سطرهای انتخاب شده رو برمیگردونه، اگر یک سطر رو انتخاب کردین همون سطر و اگر بیش از یک سطر انتخاب کردین اونهارو به صورت آرایه برمیگردونه.
شما برای حل مشکل
این قسمت:
public void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
int i;
i = e.RowIndex;
q = i;
}
و این قسمت:
public static int q;
رو حذف بکنید.
و این قسمت رو :
public void pictureBox1_Click(object sender, EventArgs e)
{
edit_student f = new edit_student();
string d = dataGridView1.Rows[q].Cells[0].Value.ToString();
f.textBox6.Text = d;
string d1 = dataGridView1.Rows[q].Cells[1].Value.ToString();
f.textBox2.Text = d1;
string d3 = dataGridView1.Rows[q].Cells[2].Value.ToString();
f.textBox5.Text = d3;
}
به این شکل تغییر بدین:
public void pictureBox1_Click(object sender, EventArgs e){
edit_student f = new edit_student();
f.textBox6.Text = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
f.textBox2.Text = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();
f.textBox5.Text = dataGridView1.SelectedRows[0].Cells[2].Value.ToString();
//اینجا یک چیزی رو فراموش کردید، برای ویرایش رکورد مورد نظر باید شناسه دانش آموز زو هم به فرم ویرایش ارسال کنید.(برای انجام اینکار توضیحات پایین رو ببینید)
f.stid = dataGridView1.SelectedRows[0].Cells[3].Value
f.ShowDialog();
}
توضیحات:
1. در فرم جدول، یک ستون به انتهای ستونهای DataGridView اضافه کنید.(دقت کنید که ستون جدید بعد از ستونهای نام، فامیل و اسم پدر قرار بگیره). و خاصیت Visible ستون جدید رو غیر فعال کنید.تا نمایش داده نشود.
2. در فرم ویرایش یک متغیر با نام stid و از نوع var و قابلیت دسترسی Public تعریف کنید.(public var stid;)
این کدها رو :
SqlConnection cnc = new SqlConnection(ConfigurationManager.ConnectionStrin gs["c"].ConnectionString);
string sqlcommand = "update student set (stname=@stname,stfamil=@stfamil,stfather=@stfathe r where stid=@stid)";
SqlCommand cmd = new SqlCommand(sqlcommand, cnc);
cmd.Parameters.AddWithValue("@stname", textBox6.Text);
cmd.Parameters.AddWithValue("@stfamil", textBox2.Text);
cmd.Parameters.AddWithValue("@stfather", textBox5.Text);
cnc.Open();
cmd.ExecuteNonQuery();
cnc.Close();
به شکل زیر تغییر بدید:
try
{
SqlConnection cnc = new SqlConnection(ConfigurationManager.ConnectionStrin gs["c"].ConnectionString);
SqlCommand cmd = new SqlCommand("UPDATE student SET stname=@stname,stfamil=@stfamil,stfather=@stfather WHERE stid=@stid", cnc);
cmd.Parameters.AddWithValue("@stname", textBox6.Text);
cmd.Parameters.AddWithValue("@stfamil", textBox2.Text);
cmd.Parameters.AddWithValue("@stfather", textBox5.Text);
cmd.Parameters.AddWithValue("@stid", stid);
if(cnc.State != ConnectionState.Open)
cnc.Open();
cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
cnc.Close();
}
توصیه های تجربی برنامه نویس:
1. قبل از ذخیره دانش آموز جدید یا ویرایش اطلاعات اون، داده های مهم (نام، فامیلی و ...) رو توی برنامه چک کنید که خالی نیاشن(در این صورت ممکنه با خطا مواجه بشید).
2. از تابع try catch برای خطایابی سریع کدهای نوشته شده استفاده کنید(نمونه اش در سایت موجود است).
3. از تعریف متغرهای بی مورد خودداری کنید.
4 برای رسیدن به یک هدف در کد نویسی ممکنه راههای بیشترو راحت تری رو داشته باشید. ولی قواعد و قوانین کد نویسی رو نقض نکنید.
موفق باشید