PDA

View Full Version : سوال: جابجایی ردیف های dataGridView



c-sharp_South
سه شنبه 20 فروردین 1392, 22:09 عصر
سلام دوستان عزیز.
خب ادمین های محترم زحمت کشیدن تاپیک قبلی رو در حین بدون ایراد بودن پاک کردن.مرسی :قلب:
--------------
یک مشکل فوری توی برنامه ام بوجود اومده.
اگه بشه این قابلیت رو به برنامه داد که ردیف های datagridview رو بشه با موس در صورت نیاز
جابجه کرد مشکل کامل حل میشه.
بانک اطلاعاتی برنامه access است و از ado استفاده شده.
ممنون میشم راهنمایی کنید.

C#‎_best_Programmer
سه شنبه 20 فروردین 1392, 22:29 عصر
به بانک ربطی نداره دوتا رویداد می خواد و یکی selected rowsو دومی drag
حالا همنطور که میدونی با روش حبابی می تونی جاشونو عوض کنی

c-sharp_South
سه شنبه 20 فروردین 1392, 22:35 عصر
ممنون . میشه توی کد نویسیش کمکم کنید ؟
بلد نیستم این قسمت رو.

c-sharp_South
سه شنبه 20 فروردین 1392, 22:47 عصر
یک کم کامل تر توضیح بدم:
یک بانک اطلاعاتی است که از ado و بانک اطلاعاتی access پیروی میکنه.
برنامه به طور معمولی ردیف هاش به این صورت است:
http://s3.picofile.com/file/7720107846/radif1_kamel.png
بعد اگه یک ردیف رو اشتباه وارد کرده باشی یا به هر دلیلی بعدا بخوای ردیف رو پاک کنی به این صورت میشه:
http://s3.picofile.com/file/7720111070/radif2hazf.png
توی عکس بالا ردیف 2 حذف شده.حالا اگه بخواهییم یک ردیف دیگه را اضافه کنیم و اسم اون رو 2 بزاریم اینجوری میشه:
http://s1.picofile.com/file/7720114301/3.png
چه راه حلی هست واسه این مشکل؟
دیوونه شدم با این مشکل.
بهترین راهی که به ذهنم میرسه اینه که یک قابلیت رو به برنامه داد که بشه ردیف های datagridview رو با موس در صورت
نیاز جابجه کرد که بشه مشکل عکس شماره 3 رو با جابجایی درست کرد(به شرطی که ردیف در بانک اطلاعاتی access هم جابجا بشه
تا وقتی که برنامه رو باز و بسته میکنیم دوباره برنامه به حالت قبل بر نگرده.)
راه حل چیه؟خواهش میکنم کمکم کنید.
اگه لازمه بگید که فول سورس رو بهتون بدم که درستش کنید.فقط زحمتش رو برام بکشید.باید تا فردا ظهر تموم شده باشه.

C#‎_best_Programmer
چهارشنبه 21 فروردین 1392, 00:46 صبح
farda shab ye nemone mizaram shab khosh

Mahmoud.Afrad
چهارشنبه 21 فروردین 1392, 01:12 صبح
از اونجایی که ستون ردیف فقط برای نمایش هست برای مقداردهی به سلولهای این ستون میتونید از رویدادهای گریدویو استفاده کنید.

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
dataGridView1.Rows[e.RowIndex].Cells["Radif"].Value = e.RowIndex + 1;
}

خود به خود مقدارش به روز میشه و دیگه نیازی نیست جای دیگه ردیف را مقدار بدید.

c-sharp_South
چهارشنبه 21 فروردین 1392, 01:21 صبح
از اونجایی که ستون ردیف فقط برای نمایش هست برای مقداردهی به سلولهای این ستون میتونید از رویدادهای گریدویو استفاده کنید.

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
dataGridView1.Rows[e.RowIndex].Cells["Radif"].Value = e.RowIndex + 1;
}

خود به خود مقدارش به روز میشه و دیگه نیازی نیست جای دیگه ردیف را مقدار بدید.

مرسی.
این کد رو دادم به برنامه ولی جواب نگرفتم:


private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
dataGridView1.Rows[e.RowIndex].Cells["2"].Value = e.RowIndex + 1;
}

Mahmoud.Afrad
چهارشنبه 21 فروردین 1392, 01:24 صبح
از چه گریدویویی استفاده میکنی؟ باید رویدادی شبیه RowPrePaint داشته باشه(رویدادی مربوط به Paint سطر). کد را در اون بنویس.

c-sharp_South
چهارشنبه 21 فروردین 1392, 01:32 صبح
رویداد RowPrePaint رو داره . کد رو وقتی بهش میدم و برنامه رو اجرا میکنم زمانی که میخواد Form نمایش Datagridview نمایش داده بشه
برنامه هنگ میکنه . ارور خواصی نمیده . کلا برنامه غیر فعال میشه.

c-sharp_South
چهارشنبه 21 فروردین 1392, 12:10 عصر
ایک پروژه نمونه اینجا بزار.(اگر حجمش کمه)

مرسی.از طریق پیغام خصوصی بهتون دادم.حجم حدود 3مگابایت !

esafb52
چهارشنبه 21 فروردین 1392, 12:31 عصر
دوست عزیز یه ستون رو خودت به گریدت اضافه کن بعدش تو این رویداد گرید این کد رو بنویس حل میشه
private void dgw_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
dgw.Rows[e.RowIndex].Cells[0].Value = e.RowIndex + 1;
}

c-sharp_South
چهارشنبه 21 فروردین 1392, 17:39 عصر
مرسی.مشکل خودکار شدن حل شد :قلب:
فقط الان موقع اینکه میخوام یک اطلاعات جدید رو ثبت کنم این Error میاد:
Number of query and destination fields are not the some.

Mahmoud.Afrad
چهارشنبه 21 فروردین 1392, 17:52 عصر
کجا ثبت کنی؟ داخل دیتابیس؟ کد اینزرت را بزار. در ضمن شماره ردیف نباید ثبت بشه!

c-sharp_South
چهارشنبه 21 فروردین 1392, 17:56 عصر
کجا ثبت کنی؟ داخل دیتابیس؟ کد اینزرت را بزار. در ضمن شماره ردیف نباید ثبت بشه!

مرسی.شماره ردیف رو از ثبت شدن پاک کردم درست شد.
الان توی حذف کردن یکی از ردیف ها مشکل پیش اومده . اگه بخوام یکی از ردیف ها رو حذغ کنم برنامه هنگ میکنه.
کد حذف:


private void glassButton3_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedCells.Count != 0)
{
if (MessageBox.Show("آیا مایلید مورد انتخاب شده حذف شود؟", "سوال(حذف)؟", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
try
{
MSUP = dataGridView1.CurrentRow.Cells["FN"].Value.ToString();
SSUB = dataGridView1.CurrentRow.Cells["LN"].Value.ToString();

con = new OleDbConnection(connect);
con.Open();
string query = "DELETE FROM zirna WHERE m_sub=@p1 AND s_sub=@p2";

command = new OleDbCommand();
command.Parameters.AddWithValue("@p1", MSUP);
command.Parameters.AddWithValue("@p2", SSUB);
command.CommandText = query;
command.Connection = con;
command.ExecuteNonQuery();
con.Close();
command.Dispose();
con.Dispose();
load();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

}
}
}

esafb52
چهارشنبه 21 فروردین 1392, 20:25 عصر
سلام اینو ببین:
if (dgw.Rows.Count > 1)
{
if (MessageBox.Show(
"آیا مایلید مورد انتخاب شده حذف شود؟","سوال(حذف)؟",
MessageBoxButtons.YesNo,MessageBoxIcon.Question) == DialogResult.Yes)
{
string Lname = dgw.CurrentRow.Cells["Id"].Value.ToString();
cmd.CommandText = "DELETE FROM table1 WHERE id=@p1 ";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@p1", Lname);
iud(cmd);
}
}
else
{
MessageBox.Show("لطفا یک مورد را انتخاب نمایید");
}

c-sharp_South
چهارشنبه 21 فروردین 1392, 21:48 عصر
مرسی .
dgw که همون datagridview1 است.
cmd هم که همون command است
iud رو نفهمیدم چیه :متفکر:

esafb52
چهارشنبه 21 فروردین 1392, 22:35 عصر
مگه درس بهداشت و تنظیم خانواده رو پاس نکردی !!!(شوخی)
یه متد برای سه عمل insert,update,delete,

public void iud(OleDbCommand cmd)
{
cmd.Connection = con;
con.Open();
da.SelectCommand = cmd;
ds.Clear();
cmd.ExecuteNonQuery();
con.Close();
da.Update(ds, "table1");
LoadAll();
cmd.Dispose();
}

esafb52
چهارشنبه 21 فروردین 1392, 22:54 عصر
یه ستون به دیتا بیست اضافه کن به نام id و از نوع اتو نامبر
if (dataGridView1.Rows.Count != 0)//tedade cell hayi ke select shodan
{
if (MessageBox.Show("آیا مایلید مورد انتخاب شده حذف شود؟", "سوال(حذف)؟", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
try
{
string Lname = dataGridView1.CurrentRow.Cells["Id"].Value.ToString();
//MSUP = dataGridView1.CurrentRow.Cells["FN"].Value.ToString();
//SSUB = dataGridView1.CurrentRow.Cells["LN"].Value.ToString();

con = new OleDbConnection(connect);
con.Open();
string query = "DELETE FROM table1 WHERE id=@p1 ";
command = new OleDbCommand();
command.Parameters.AddWithValue("@p1", Lname);
// command.Parameters.AddWithValue("@p2", SSUB);
command.CommandText = query;
command.Connection = con;
command.ExecuteNonQuery();
con.Close();
command.Dispose();
con.Dispose();
load();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

}

c-sharp_South
پنج شنبه 22 فروردین 1392, 11:55 صبح
از صبح دوباره نشستم کدهای برنامه رو چک کردم و دوباره نوشتم.
دقیقا به محز اینکه:


private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
dataGridView1.Rows[e.RowIndex].Cells[2].Value = e.RowIndex + 1;
}


رو اضافه میکنم برنامه هنگ میکنه.مثلا وقتی برنامه رو باز میکنم و فرم بالا میاد همون اول کار یک قسمت از برنامه نشون داده نمیشه.
باید فرم رو حرکت داد تا نشون داده بشه . دکمه ی خروج برنامه رو وقتی میزنم برنامه کامل هنگ میکنه . وقتی میخوام یک ردیف رو حذف کنم برنامه
هنگ میکنه . فقط توی اضافه کردن ردیف و خودکار شدن شماره ردیف مشکلی نداره.
http://s1.picofile.com/file/7721866769/scrool.jpg
توی عکس بالا نگاه کنید . Scrool Bar حذف شده . باید موس رو روش بیارم تا نشون داده بشه.
این تغییرات فقط بعد از اضافه کردن کد بالا ایجاد میشه.
مــشــــــــــکــــــــــ ل کــجـــــــــاســــــــــ ـــــــــتـــــــ ؟

c-sharp_South
پنج شنبه 22 فروردین 1392, 22:34 عصر
لــطــفــــــــــــــا کــمکـــــــم کــنــیــــــد ایــن مــوضــــــوع کــامــل حــــــــــــــل بــشــــــه :ناراحت:

esafb52
پنج شنبه 22 فروردین 1392, 22:49 عصر
دوست عزیز من تست کردم هنگ نکرد تو سیستم من الان دقیقا مشکلت چیه؟

c-sharp_South
پنج شنبه 22 فروردین 1392, 23:28 عصر
دوست عزیز من تست کردم هنگ نکرد تو سیستم من الان دقیقا مشکلت چیه؟

دقیقا کد Auto Number رو که اضافه میکنم:


private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
dataGridView1.Rows[e.RowIndex].Cells[2].Value = e.RowIndex + 1;
}


بعد از اجرا کردن برنامه . برنامه درست کار نمیکنه و هنگ میکنه.البته Auto Number درست میشه و حتی اگه ردیف جدیدی
ایجاد کنی باز مشکل نداره و شماره ردیف ها به ترتیب زده میشن.
فقط برنامه هنگ میکنه.
مثل این عکس : http://s1.picofile.com/file/7721866769/scrool.jpg

esafb52
پنج شنبه 22 فروردین 1392, 23:37 عصر
از try استفاده کن و ببین چه خطایی میده

c-sharp_South
جمعه 23 فروردین 1392, 10:07 صبح
از try استفاده کن و ببین چه خطایی میده

Column named 2 cannot be found.
parametr name: columnName


ولی Column2 رو ساختم که ...
dataGridView1.Columns[2].HeaderText = "ردیف";
dataGridView1.Columns[2].Width = 50;
:متفکر::متفکر::متفکر:

esafb52
جمعه 23 فروردین 1392, 10:32 صبح
دوست عزیز شماره ستون ها رو یکی به همه اضافه کن وقتی یه ستون اضافه میکنی شماره همه ستون هات یکی اضافه میشه
dataGridView1.Columns[0].HeaderText = "موضوع اصلی";//

تبدیل به :
dataGridView1.Columns[1].HeaderText = "موضوع اصلی";//
و همین طور برای بقیه

hbabagoly
دوشنبه 30 اردیبهشت 1392, 21:53 عصر
دوست عزیز بالاخره مشکل شما حل شد یا نه؟

ahmadsadeghi2
دوشنبه 27 خرداد 1392, 14:04 عصر
سلام دوستان
آیا میشه دیتاگریدویو رو به صورت گرافیکی اندازه های سلول هاشو همانند دلفی تغیر داد؟
آخه تو دلفی بعد اضافه کردن دیتاگریدویو به فرم با اکتیو کردن دیتا سورسش فیلد هاش یا همون سلول هاش قابل مشاهده اما تو سی شارپ همش مشکی !
در کل میخوام بگم میشه از این حالت مشکی درش بیاریم و بتونیم سلول هارو قبل از اجرا کردن اندازه هاشون کوچیک یا بزرگ کنیم؟؟؟

c-sharp_South
دوشنبه 27 خرداد 1392, 15:43 عصر
اگه منظور شما رو درست فهمیده باشم جواب شما میشه این: ( توی فرم لود قرار بدید )

dg.Columns[0].Width = 290;