PDA

View Full Version : تشخیص سطرهایی از datagridview صفحه بندی شده که checkbox آن ردیف در حالت انتخاب هست



f_naderi
دوشنبه 12 مهر 1395, 16:51 عصر
سلام دوستان

دوستان من دیتاگرید رو به صورت معمولی صفحه بندی کردم یعنی یک دکمه بعدی و یک دکمه قبلی قرار دادم حالا چطور میتونم وقتی کاربر یک گزینه رو انتخاب کرد (چک باکس مربوطه اش را انتخاب کرد) بلافاصله به لیست انتخاب شده ها و وقتی اون گزینه رو از حالت انتخاب خارج کرد همون موقع از لیست انتخاب شده ها حذفش کنم.

دوستان ،من برای اینکه هر تغییری در دیتاگرید انجام میشه(یعنی وقتی چک باکس مربوط به هر رکورد زده میشه رکورد مربوطه اطلاعاتش نگهداری بشه) این کد رو در cellmouseup نوشتم ولی وقتی دکمه نمایش رو میزنم هر رکورد چند بار نمایش داده میشه ؟؟؟
private void dataGridView1_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e) {
if (e.ColumnIndex == 0 && e.RowIndex > -1)
{
dataGridView1.CommitEdit(DataGridViewDataErrorCont exts.Commit);

foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (Convert.ToBoolean(row.Cells[0].Value))
{
DataRow dr = dt_select.NewRow();


dr[0] = row.Cells[2].Value.ToString();
dt_select.Rows.Add(dr);
}
}

}
}
مشکل از کجاست آیا باید در رویداد دیگه ای بنویسم؟؟؟



کد صفحه بندی دیتاگرید

دکمه بعدی
try {
if (this.currentpageindex < this.Totalpage)
{
dataGridView1.Rows.Clear();

DataTable dt_rec = new DataTable();

DataColumn col1 = new DataColumn("Num_Question", typeof(string));
DataColumn col2 = new DataColumn("QTs_Name", typeof(string));
DataColumn col3 = new DataColumn("Correct_Ans", typeof(string));
DataColumn col4 = new DataColumn("Base_N", typeof(string));
DataColumn col5 = new DataColumn("Branch", typeof(string));
DataColumn col6 = new DataColumn("L_Code", typeof(string));
DataColumn col7 = new DataColumn("Chapter_N", typeof(string));
DataColumn col8 = new DataColumn("Section_N", typeof(string));
DataColumn col9 = new DataColumn("Type_Q", typeof(string));

dt_rec.Columns.Add(col1);
dt_rec.Columns.Add(col2);
dt_rec.Columns.Add(col3);
dt_rec.Columns.Add(col4);
dt_rec.Columns.Add(col5);
dt_rec.Columns.Add(col6);
dt_rec.Columns.Add(col7);
dt_rec.Columns.Add(col8);
dt_rec.Columns.Add(col9);

dt_rec.Clear();

this.currentpageindex++;

dt_rec = Getcurrentrecords(this.currentpageindex);

string filename = "";
object FilePath = "";
for (int i = 0; i < dt_rec.Rows.Count; i++)//تبدیل فایلهای word به عکس
{
imageList1.Images.Clear();
filename = dt_rec.Rows[i][1].ToString();
FilePath = (Object)String.Format("{0}\\WordFile\\" + filename, System.Windows.Forms.Application.StartupPath);
if (File.Exists(FilePath.ToString()))
{
oWordDoc = oWordApp.Documents.Open(ref FilePath, ref oMissing, ref readOnly, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);

byte[] bytes = (byte[])oWordApp.ActiveDocument.Content.EnhMetaFileBits;

Image temp;
MemoryStream ms = new MemoryStream(bytes);
temp = Image.FromStream(ms);

Bitmap b = new Bitmap(temp);

this.imageList1.ImageSize = new Size(256, 130);
imageList1.Images.Add(b);
oWordDoc.Close(ref oFalse, ref oMissing, ref oMissing);
dataGridView1.Rows.Add(false, imageList1.Images[0], dt_rec.Rows[i][0].ToString(), dt_rec.Rows[i][3].ToString() + "." + dt_rec.Rows[i][4].ToString() + "." + dt_rec.Rows[i][5].ToString());
dataGridView1.Rows[i].Height = 130;
}
}
}
}
catch (Exception ex)
{
foreach (Process p in Process.GetProcessesByName("WINWORD"))
p.Kill();
MessageBox.Show(ex.Message, "پیغام", MessageBoxButtons.OK);
}

دکمه قبلی

try {
if (this.currentpageindex > 1)
{
dataGridView1.Rows.Clear();

DataTable dt_rec = new DataTable();

DataColumn col1 = new DataColumn("Num_Question", typeof(string));
DataColumn col2 = new DataColumn("QTs_Name", typeof(string));
DataColumn col3 = new DataColumn("Correct_Ans", typeof(string));
DataColumn col4 = new DataColumn("Base_N", typeof(string));
DataColumn col5 = new DataColumn("Branch", typeof(string));
DataColumn col6 = new DataColumn("L_Code", typeof(string));
DataColumn col7 = new DataColumn("Chapter_N", typeof(string));
DataColumn col8 = new DataColumn("Section_N", typeof(string));
DataColumn col9 = new DataColumn("Type_Q", typeof(string));

dt_rec.Columns.Add(col1);
dt_rec.Columns.Add(col2);
dt_rec.Columns.Add(col3);
dt_rec.Columns.Add(col4);
dt_rec.Columns.Add(col5);
dt_rec.Columns.Add(col6);
dt_rec.Columns.Add(col7);
dt_rec.Columns.Add(col8);
dt_rec.Columns.Add(col9);

dt_rec.Clear();

this.currentpageindex--;

dt_rec = Getcurrentrecords(this.currentpageindex);

string filename = "";
object FilePath = "";
for (int i = 0; i < dt_rec.Rows.Count; i++)//تبدیل فایلهای word به عکس
{
imageList1.Images.Clear();
filename = dt_rec.Rows[i][1].ToString();
FilePath = (Object)String.Format("{0}\\WordFile\\" + filename, System.Windows.Forms.Application.StartupPath);
if (File.Exists(FilePath.ToString()))
{
oWordDoc = oWordApp.Documents.Open(ref FilePath, ref oMissing, ref readOnly, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);

byte[] bytes = (byte[])oWordApp.ActiveDocument.Content.EnhMetaFileBits;

Image temp;
MemoryStream ms = new MemoryStream(bytes);
temp = Image.FromStream(ms);

Bitmap b = new Bitmap(temp);

this.imageList1.ImageSize = new Size(256, 130);
imageList1.Images.Add(b);
oWordDoc.Close(ref oFalse, ref oMissing, ref oMissing);
dataGridView1.Rows.Add(false, imageList1.Images[0], dt_rec.Rows[i][0].ToString(), dt_rec.Rows[i][3].ToString() + "." + dt_rec.Rows[i][4].ToString() + "." + dt_rec.Rows[i][5].ToString());
dataGridView1.Rows[i].Height = 130;
}
}
}
}
catch (Exception ex)
{
foreach (Process p in Process.GetProcessesByName("WINWORD"))
p.Kill();
MessageBox.Show(ex.Message, "پیغام", MessageBoxButtons.OK);
}

juza66
پنج شنبه 15 مهر 1395, 01:04 صبح
خیلی جاها کد رو تکرار کردی، اگر یه سرچ کوچیک در انجمن بزنی صفحه بندی دیتاگرید پیدا میکنی،

و برای مشکل چک باکس ها شما هربار که صفحه بعد و قبل اجرا کنید فکر نکنم چک باکس در حالت انتخاب بمونه...!!

میتونی در رویداد دیتاگریدت cellmouseup فکر کنم باشه هر چک باکسی که زده میشه رو یه جا دخیره کنی مثه ارایه و هی بهش اضاف کنی بعد ارایه ات رو توی حلقه حذف صدا کنی و عملیات حذف یا غیره رو انجام بدی..

حالا نظر اساتید و دوستان رو هم ببینیم چیه..

Mahmoud.Afrad
پنج شنبه 15 مهر 1395, 01:50 صبح
به جای CellMouseUp از CellContentClick استفاده کنید. و البته بایست فقط ردیفی که در آن هستید چک بشه و به حلقه نیازی نیست.
چیزی شبیه این(اصلاح کد با خود شما)
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex != 0 || e.RowIndex < 0) return;
DataGridView dgv = sender as DataGridView;
if (dgv == null) return;
dgv.EndEdit();
object objValue = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
bool boolValue = objValue == null ? false : (bool)objValue;
var dataTable = dgv.DataSource as DataTable;
if (dataTable == null) return;
int id = (int) dgv.Rows[e.RowIndex].Cells["Id"].Value;
DataRow currentDataRow = dataTable.Rows.Find(id);
DataRow foundedDataRow = dt_select.Rows.Find(id);

if (boolValue) // if new value is true, then add
{
// add currentDataRow if it's not added
if (foundedDataRow == null)
{
dt_select.Rows.Add(currentDataRow.ItemArray);
}
}
else // if new value is false then remove
{
// remove foundedDataRow if it's added before
if (foundedDataRow != null) dt_select.Rows.Remove(foundedDataRow);
}
}

کدهاتون هم با ایجاد متد و کلاس، میتونه خیلی کمتر بشه و از تکرار بپرهیزید.

f_naderi
پنج شنبه 15 مهر 1395, 10:45 صبح
من این رو نوشتم ولی موقع کلیک روی ستون انتخاب (چک باکس) اررور میده :specifide cast is not valid
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) {
if (e.ColumnIndex != 0 || e.RowIndex < 0) return;
DataGridView dgv = sender as DataGridView;
if (dgv == null) return;
dgv.EndEdit();
object objValue = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
bool boolValue = objValue == null ? false : (bool)objValue;
int id = (int)dgv.Rows[e.RowIndex].Cells[2].Value;
.tostring()DataRow foundedDataRow = dt_select.Rows.Find(id);


if (boolValue) // if new value is true, then add
{

dt_select.Rows.Add(id.ToString());

}
else // if new value is false then remove
{
// remove foundedDataRow if it's added before
if (foundedDataRow != null)
dt_select.Rows.Remove(foundedDataRow);
}
}

f_naderi
پنج شنبه 15 مهر 1395, 12:36 عصر
اررور قبلی برطرف شد ولی حالا میگه table dosnte primary key در صورتی که من موقع ساخت تیبل dt_Select نوشتم.
DataColumn col = new DataColumn("Num_Question", typeof(string)); dt_select.PrimaryKey = new DataColumn[] { dt_select.Columns["col"] };


dt_select.Columns.Add(col);
dt_select.Clear();


بینهایت سپاسگزارم حل شد.