PDA

View Full Version : درج در قسمت دلخواه از datagridview



unique1984
پنج شنبه 24 بهمن 1387, 00:22 صبح
سلام
من عملیات درج رو در خود datagridview انجام میدم که تا اینجا مشکلی نیست، اما میخوام در هر جایی از گرید که خواستم عملیات درج رو انجام بدم (لزوما در انتهای گرید نباشه).مثلا بتونم بین دو رکورد ، رکورد جدید رو درج کنم.
ایا راهش شیفت دادن رکوردها به سمت پائینه؟ یا روش خاصی برای این مورد وجود داره؟
مرسی

اوبالیت به بو
پنج شنبه 24 بهمن 1387, 02:50 صبح
dataGridView1.Rows.Insert(intRowsIndex, intCount);
intRowIndex: شماره سطري رو كه مي خواين از اونجا شيفت بدين رو مقداردهي مي كنه.
intCount: تعداد سطرهايي كه مي خواين شيفت بدين.

unique1984
پنج شنبه 24 بهمن 1387, 09:37 صبح
مرسی
اما من datagridview رو موقع لود شدن فرم به بانک وصل می کنم. بنابراین زمانی که این دستور رو به کار میبرم پیغام خطای زیر رو میده:

Rows cannot be programmatically added to the DataGridView's rows collection when the control is data-bound.

اوبالیت به بو
پنج شنبه 24 بهمن 1387, 14:43 عصر
اما من datagridview رو موقع لود شدن فرم به بانک وصل می کنم. بنابراین زمانی که این دستور رو به کار میبرم پیغام خطای زیر رو میده:
ميشه كدي رو كه باعث Bound شدن DataGridView در Form_Load ميشه + كدي كه ميگين باعث خطا ميشه رو اينجا بذاريد؟

sm4899
جمعه 25 بهمن 1387, 11:58 صبح
با سلام
این کد خطا میده
Rows cannot be programmatically added to the DataGridView's rows collection when the control is data-bound.

unique1984
جمعه 25 بهمن 1387, 13:23 عصر
private void Form1_Load(object sender, EventArgs e)
{
cmd.CommandText = "select * from tbl";
cmd.Connection = conn;
sda.SelectCommand = cmd;

conn.Open();
sda.Fill(ds, "t1");
conn.Close();

dataGridView1.DataSource = ds;
dataGridView1.DataMember = "t1";
}
کد اضافه کردن رو جهت تست در یک باتن نوشتم.

dataGridView1.Rows.Insert(dataGridView1.CurrentRow .Index+1, 1);

unique1984
جمعه 25 بهمن 1387, 18:11 عصر
یه راه دیگه رو تست کردم که به جای اینکه با گرید کار کنه با دیتاست کار میکنه.

DataRow dr= ds.Tables["t1"].NewRow();
ds.Tables["t1"].Rows.InsertAt(dr, dataGridView1.CurrentRow.Index+1);
+

private void Form1_FormClosed_1(object sender, FormClosedEventArgs e)
{
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(sda);
sda.Update(ds, "t1");
}
این راه جواب میده اما یه مشکلی داره.جایی که من میخوام سطر باز میکنه ، اطلاعات رو هم همونجا وارد می کنم ، اما بعد از اینکه در بانک ثبت شد. (با توجه به مثال من ، وقتی فرم رو میبندم و مجددا باز می کنم ) اون رکورد به آخر گرید انتقال داده می شه.
البته کاملا منطقیه چون ایندکس گذاری sql همینطوریه. یه راه حل هم داره و اون اینکه وقتی میخوام در گرید درج کنم ، از محل رکورد جدید تا آخر گرید ، تمام رکوردها رو در یک datatable بریزم و اونها رو از تیبل فعلی پاک کنم ، بعد که رکورد جدید رو اضافه کردم، مجددا اونها رو به بانک اضافه کنم!! حالا اگه رکوردها خیلی زیاد باشه و من بخوام به اول گرید رکورد اضافه کنم و بخوام اینهمه رکورد رو حذف و سپس اضافه کنم که وقت میبره!!
کار دیگه ای نمی شه کرد که سرعت هم پایین نیاد؟

elahe1364
یک شنبه 27 بهمن 1387, 11:08 صبح
سلام
منم همین مشکل رو دارم
کسی راهکاری نداره؟

sahmah65
دوشنبه 28 بهمن 1387, 14:15 عصر
سلام
برای درج اول داخل DataTable ای که این گرید به اون بایند هست اضافه کن و برای حفظ موقعیت کاری که خودم تو کارهام می کنم اینه که یه فیلد تو جدول برای شماره ستون در نظر می گیرم و یه دکمه تو فرم برای ثبت حالت ردیف ها ((یا می تونی داخل Close فرم بزاری))
می زارم که فیلد مربوط به شماره سطر ها رو با توجه به شماره سطرهای گرید Update کنه.
جابجایی هم که ساده هست وکافیه یه Row موقتی تعریف کنی و او اطلاعات دو سطر رو جابجا کنی و دوباره از همون دکمه ثبت حالات استفاده کنی.