PDA

View Full Version : مشکل با هنگ کردن برنامه سی شارپ



اسماعیل ابراهیمی
چهارشنبه 16 مهر 1393, 11:33 صبح
به نظرتون مشکل کد زیر چیه ؟
الان حدود 350 رکورد هست داخل دیتاگرید - هنگه هنگ هم نمیشه - چند لحظه هنگ میکنه



using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using Transport.BLL;
namespace Transport
{
public partial class transport_in : Office2007Form
{
public transport_in()
{
InitializeComponent();
}


private void clearAllLabels()
{
lbl_transport_type.Text = "---";
lbl_transport_peyment.Text = "---";
lbl_transport_number.Text = "---";
lbl_transport_date.Text = "---";
lbl_transport_weight.Text = "---";
lbl_transport_total_price.Text = "---";
lbl_transport_agency_portion.Text = "---";
lbl_transport_description.Text = "---";
lbl_transport_import_date.Text = "---";
lbl_transport_max_weight.Text = "---";
lbl_transport_base_price.Text = "---";
lbl_transport_addition_weight.Text = "---";
lbl_transport_comany_agency_portion.Text = "---";
lbl_transport_company_portion.Text = "---";
lbl_company_name.Text = "---";
}


private void setLabelsContent()
{
try
{
clearAllLabels();
if (dgv_transport.Rows.Count > 0)
{
lbl_transport_id.Text = dgv_transport.Rows[dgv_transport.CurrentRow.Index].Cells[0].Value.ToString();

lbl_transport_type.Text = dgv_transport.Rows[dgv_transport.CurrentRow.Index].Cells[6].Value.ToString();
lbl_transport_peyment.Text = dgv_transport.Rows[dgv_transport.CurrentRow.Index].Cells[5].Value.ToString();
lbl_company_name.Text = dgv_transport.Rows[dgv_transport.CurrentRow.Index].Cells[4].Value.ToString();
lbl_transport_number.Text = dgv_transport.Rows[dgv_transport.CurrentRow.Index].Cells[2].Value.ToString();
lbl_transport_date.Text = dgv_transport.Rows[dgv_transport.CurrentRow.Index].Cells[1].Value.ToString();
lbl_transport_weight.Text = dgv_transport.Rows[dgv_transport.CurrentRow.Index].Cells[12].Value.ToString();
lbl_transport_total_price.Text =special_class.ToFormattedThousands(dgv_transport. Rows[dgv_transport.CurrentRow.Index].Cells[7].Value.ToString());
lbl_transport_agency_portion.Text = special_class.ToFormattedThousands(dgv_transport.R ows[dgv_transport.CurrentRow.Index].Cells[9].Value.ToString());
lbl_transport_description.Text = dgv_transport.Rows[dgv_transport.CurrentRow.Index].Cells[14].Value.ToString();
lbl_transport_import_date.Text = dgv_transport.Rows[dgv_transport.CurrentRow.Index].Cells[11].Value.ToString();
lbl_transport_max_weight.Text = dgv_transport.Rows[dgv_transport.CurrentRow.Index].Cells[17].Value.ToString();
lbl_transport_base_price.Text = special_class.ToFormattedThousands(dgv_transport.R ows[dgv_transport.CurrentRow.Index].Cells[18].Value.ToString());
lbl_transport_addition_weight.Text = special_class.ToFormattedThousands(dgv_transport.R ows[dgv_transport.CurrentRow.Index].Cells[19].Value.ToString());
lbl_transport_comany_agency_portion.Text = special_class.ToFormattedThousands(dgv_transport.R ows[dgv_transport.CurrentRow.Index].Cells[20].Value.ToString());
lbl_transport_company_portion.Text = special_class.ToFormattedThousands(dgv_transport.R ows[dgv_transport.CurrentRow.Index].Cells[10].Value.ToString());
}
else
{
clearAllLabels();
}


if (dgv_transport.Rows.Count<1)
{
clearAllLabels();
}
}
catch (Exception)
{
clearAllLabels();
}

}


private void addSeperatorToNumericColumns()
{
dgv_transport.Columns[9].DefaultCellStyle.Format = "###,###,###,###,###,###";
dgv_transport.Columns[11].DefaultCellStyle.Format = "###,###,###,###,###,###";
dgv_transport.Columns[20].DefaultCellStyle.Format = "###,###";
}


// متد پر کردن اطلاعات جدول بارنامه ها
public void FillDataGrid()
{
DataTable ResultTable = bll_transport.SelectAllRecord("tbl_transport_in");
dgv_transport.DataSource = ResultTable;


dgv_transport.Columns[0].HeaderText = "شناسه";
dgv_transport.Columns[1].HeaderText = "تاریخ بارنامه";
dgv_transport.Columns[2].HeaderText = "شماره بارنامه";
dgv_transport.Columns[3].HeaderText = "شناسه شرکت";
dgv_transport.Columns[4].HeaderText = "شرکت";
dgv_transport.Columns[5].HeaderText = "نوع پرداخت";
dgv_transport.Columns[6].HeaderText = "نوع بارنامه";
dgv_transport.Columns[7].HeaderText = "مبلغ بارنامه";
dgv_transport.Columns[8].HeaderText = "کد شهر";
dgv_transport.Columns[9].HeaderText = "سهم نمایندگی";
dgv_transport.Columns[10].HeaderText = "سهم شرکت";
dgv_transport.Columns[11].HeaderText = "تاریخ ثبت";
dgv_transport.Columns[12].HeaderText = "وزن";
dgv_transport.Columns[13].HeaderText = "کرایه حمل";
dgv_transport.Columns[14].HeaderText = "توضیحات";
dgv_transport.Columns[15].HeaderText = "آیا نماینده شهرستان است؟";
dgv_transport.Columns[16].HeaderText = "سهم کنونی نماینده شهرستان";
dgv_transport.Columns[17].HeaderText = "حداکثر وزن قیمت ثابت";
dgv_transport.Columns[18].HeaderText = "قیمت پایه برای وزن ثابت";
dgv_transport.Columns[19].HeaderText = "قیمت برای هر کیلو بار اضافه";
dgv_transport.Columns[20].HeaderText = "سهم شرکت برای ارسال شهرستان";




dgv_transport.Columns[0].Visible = false;
dgv_transport.Columns[3].Visible = false;
dgv_transport.Columns[8].Visible = false;
dgv_transport.Columns[12].Visible = false;
dgv_transport.Columns[13].Visible = false;
dgv_transport.Columns[14].Visible = false;
dgv_transport.Columns[15].Visible = false;
dgv_transport.Columns[16].Visible = false;
dgv_transport.Columns[17].Visible = false;
dgv_transport.Columns[18].Visible = false;
dgv_transport.Columns[19].Visible = false;
dgv_transport.Columns[20].Visible = false;


special_class.setRowNumber(dgv_transport);
}


private void transport_in_Load(object sender, EventArgs e)
{
FillDataGrid();
}


private void btn_back_Click(object sender, EventArgs e)
{
this.Close();
}


private void btn_new_Click(object sender, EventArgs e)
{
transport_in_edit frm_transport_in_edit = new transport_in_edit();
frm_transport_in_edit.ShowDialog();
}


private void btn_edit_Click(object sender, EventArgs e)
{

}


private void transport_in_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
this.Close();
}
if (e.KeyCode==Keys.F3)
{
txt_search.Focus();
}
}


private void dgv_transport_CellEnter(object sender, DataGridViewCellEventArgs e)
{
setLabelsContent();
}


private void transport_in_Activated(object sender, EventArgs e)
{
FillDataGrid();
}


private void btn_delete_Click(object sender, EventArgs e)
{




if (dgv_transport.Rows.Count > 0)
{
try
{
string Transport_ID = lbl_transport_id.Text;






if (FMessegeBox.FarsiMessegeBox.Show("آیا از حذف اطلاعات این بارنامه مطمئن هستید ؟", "تایید حذف اطلاعات", FMessegeBox.FMessegeBoxButtons.YesNo, FMessegeBox.FMessegeBoxIcons.Question) == DialogResult.Yes)
{


string Query = "DELETE FROM tbl_transport WHERE transport_id=" + Transport_ID;


bool result = bll_transport.RunQuery(Query);
if (result)
{
lblMessage.Text = "اطلاعات با موفقيت حذف شد";
lblMessage.ForeColor = Color.Green;
}
else
{
lblMessage.Text = "خطا در حذف اطلاعات";
lblMessage.ForeColor = Color.Red;
}
FillDataGrid();
}
}
catch (Exception)
{
lblMessage.Text = "لطفاً يک رکورد را براي حذف انتخاب کنيد";
lblMessage.ForeColor = Color.Red;
}
}
}


private void txt_search_TextChanged(object sender, EventArgs e)
{
clearAllLabels();
string SQLWHERE = string.Format(" WHERE (peyment_type like '%{0}%' OR company_name like '%{0}%' OR transport_number like '%{0}%' OR transport_date like '%{0}%' OR transport_weight like '%{0}%' OR transport_total_price like '%{0}%' OR agency_portion like '%{0}%' OR transport_description like '%{0}%' OR trasport_import_date like '%{0}%' ) AND tbl_transport.transport_type='ورودی' ", txt_search.Text);

string SQLQuery = "SELECT tbl_transport.transport_id,tbl_transport.transport _date,tbl_transport.transport_number,tbl_transport .company_id,tbl_company.company_name,tbl_transport .peyment_type,tbl_transport.transport_type,tbl_tra nsport.transport_total_price,tbl_transport.city_id ,tbl_transport.agency_portion,tbl_transport.transp ort_company_portion,tbl_transport.trasport_import_ date,tbl_transport.transport_weight,tbl_transport. transport_price,tbl_transport.transport_descriptio n,tbl_transport.is_city_agency,tbl_transport.curre nt_agency_portion_price,tbl_transport.transport_cu rrent_max_fix_weight,tbl_transport.transport_curre nt_base_price,tbl_transport.transport_current_addi tion_price,tbl_transport.transport_current_agency_ portion " +
" FROM tbl_company INNER JOIN tbl_transport ON tbl_company.company_id = tbl_transport.company_id " + SQLWHERE;



DataTable ResultTable = bll_transport.search_in_transport(SQLQuery);
dgv_transport.DataSource = ResultTable;
special_class.setRowNumber(dgv_transport);
}


private void dgv_transport_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
dgv_transport.Columns[10].DefaultCellStyle.Format = "N0";
dgv_transport.Columns[7].DefaultCellStyle.Format = "N0";
dgv_transport.Columns[9].DefaultCellStyle.Format = "N0";

}
}
}

winner1
چهارشنبه 16 مهر 1393, 11:53 صبح
هرجا که حلقه هست try رو حذف کن فقط با if برنام رو کنترل کن

اسماعیل ابراهیمی
چهارشنبه 16 مهر 1393, 12:05 عصر
دوست عزیز من همچین حالتی رو ندارم - اگر هم try ای هست بعدش یه if اومده
کدهای رویداد CellEnter از کنترل DataGridView رو هم پاک کردم ولی فایده نداشت

mz6488
چهارشنبه 16 مهر 1393, 12:17 عصر
سلام.متد cell formating به اندازه تعداد رکوردها تکرار میشه.از اون ظرف هم به تعداد رکوردها دارید عمل درج شماره ردیف رو انجام میدید.واسه مشکل اولی بهتره که ستون ها رو به صورت غیر کدنویسی طراحی کنید و همونجا هم فرمت سلول رو انتخاب کنید.

اسماعیل ابراهیمی
چهارشنبه 16 مهر 1393, 12:24 عصر
فرمایشات شما همه درسته ولی اصل مشکل رو پیدا کردم

فراخونی متد FillDataGrid در رویداد Activated فرم

نمی دونم چرا چندین و چند بار اتفاق میافته

حالا مشکل اینه که وقتی کاربر میره یه بارنامه جدید اضافه می کنه و فرم اضافه کردن رو میبنده ، این دیتاگرید اتوماتیک آپدیت نمیشه

نمی دونم کد فراخوانی متد FillDataGrid که دیتاگرید رو با اطلاعات جدول بارنامه پر می کنه رو توی کدوم رویداد بنویسم الان ؟

توی Activated که نمیشه چون خیلی تکرار میشه ---- توی Form_load هم نمیشه چون فقط یه بار اتفاق میافته

نظـــــــــــــــــر شما چیه ؟

juza66
چهارشنبه 16 مهر 1393, 12:31 عصر
من برای دیتاگرید صفحه بندی ایجاد کردم، نیازی ندیدم که همه رو یکجا نمایش بدم

اسماعیل ابراهیمی
چهارشنبه 16 مهر 1393, 12:36 عصر
Juza66 عزیز - ببخشید ولی راه حل خوبی نبود - بیشتر تبلیغاتی بود تا راهکاری

juza66
چهارشنبه 16 مهر 1393, 12:44 عصر
تبلیغ ؟!!! من !!

نه بخدا، من فقط خواستم بگم چنین برنامه ای قبلا خودم نوشتم (البته اگر درست حدس زده باشم)

خواستم ببینید برای دیتاگریدم صفحه بندی کردم البته شما استاد مایی آقایی ابراهیمی قصد بی احترامی یا اذیت کردن نداشتم، آخه لود 350 رکورد فکر کنم زیاد طول بکشه :))

اسماعیل ابراهیمی
چهارشنبه 16 مهر 1393, 13:08 عصر
نه خواهش می کنم عزیز
دستتون درد نکنه

محمد آشتیانی
چهارشنبه 16 مهر 1393, 13:45 عصر
سلام
برای اینکه برنامت هنگ نکنه ، متد FillGrid رو با ترد اجرا کن

این فضای نام رو اضافه کن به فرمت

using System.Threading;

برای متد FillGrid یه delegate تعریف کن و متد خودت رو هم اینجوری تغییر بده


public delegate void _fillGrid();
private void fillGrid()
{
if (this.InvokeRequired)
{
this.Invoke(new _fillGrid(fillGrid));
return;
}
//کدهای متد خودتو اینجا بنویس
}



نهایتا هرجا خواستی متد fillGrid رو فراخوانی کنی ، اینو بجاش جایگزین کن


Thread Th = new Thread(fillGrid);
Th.Start();


و نهایتا برای آپدیت شدن گریدت بعد از بستن فرم افزودن رکورد ، اگر فرمت رو بصورت ShowDialog فراخوانی میکنی ، کافیه ترد رو بعد از نمایش فرم اجرا کنی
چیزی شبیه به این



Form1 F = new Form1();
F.ShowDialog();
Thread Th = new Thread(fillGrid);
Th.Start();




موفق باشید

winner1
چهارشنبه 16 مهر 1393, 13:54 عصر
سلام
برای اینکه برنامت هنگ نکنه ، متد FillGrid رو با ترد اجرا کن

این فضای نام رو اضافه کن به فرمت

using System.Threading;

برای متد FillGrid یه delegate تعریف کن و متد خودت رو هم اینجوری تغییر بده


public delegate void _fillGrid();
private void fillGrid()
{
if (this.InvokeRequired)
{
this.Invoke(new _fillGrid(fillGrid));
return;
}
//کدهای متد خودتو اینجا بنویس
}



نهایتا هرجا خواستی متد fillGrid رو فراخوانی کنی ، اینو بجاش جایگزین کن


Thread Th = new Thread(fillGrid);
Th.Start();


و نهایتا برای آپدیت شدن گریدت بعد از بستن فرم افزودن رکورد ، اگر فرمت رو بصورت ShowDialog فراخوانی میکنی ، کافیه ترد رو بعد از نمایش فرم اجرا کنی
چیزی شبیه به این



Form1 F = new Form1();
F.ShowDialog();
Thread Th = new Thread(fillGrid);
Th.Start();




موفق باشید
لبته اول باید رشترو استارت کنه بعد فرم رو شو کنه

اسماعیل ابراهیمی
چهارشنبه 16 مهر 1393, 18:18 عصر
لبته اول باید رشترو استارت کنه بعد فرم رو شو کنه
چیو استارت کنم ؟
رشترو ؟؟؟؟؟

winner1
چهارشنبه 16 مهر 1393, 18:39 عصر
چیو استارت کنم ؟
رشترو ؟؟؟؟؟
Thread بعدشم این دوستمون راه حلشون درسته ولی یه داستانی هست اینه سیستم مقصد چه سیستمیه اکثرا مشتریا یه سیستمی دارن که مال اسر بوقه که نمیشه از رشته استفاده کرد

اسماعیل ابراهیمی
چهارشنبه 16 مهر 1393, 20:18 عصر
نه مشتری سیستمش جدیده
یکی از شروطی که مشتریای من باید داشته باشن اینه که سیستمشون رو من باید تایید کنم :لبخند:

winner1
چهارشنبه 16 مهر 1393, 20:33 عصر
نه مشتری سیستمش جدیده
یکی از شروطی که مشتریای من باید داشته باشن اینه که سیستمشون رو من باید تایید کنم :لبخند:
خوش بحالت من که اشکم درومده با یک میلیون رکورد سر کار دارم با یه سیستمای داغون:گریه:

veniz2008
چهارشنبه 16 مهر 1393, 21:02 عصر
اصل مشکل رو پیدا کردم

فراخونی متد FillDataGrid در رویداد Activated فرم

نمی دونم چرا چندین و چند بار اتفاق میافته

حالا مشکل اینه که وقتی کاربر میره یه بارنامه جدید اضافه می کنه و فرم اضافه کردن رو میبنده ، این دیتاگرید اتوماتیک آپدیت نمیشه

نمی دونم کد فراخوانی متد FillDataGrid که دیتاگرید رو با اطلاعات جدول بارنامه پر می کنه رو توی کدوم رویداد بنویسم الان ؟

توی Activated که نمیشه چون خیلی تکرار میشه ---- توی Form_load هم نمیشه چون فقط یه بار اتفاق میافته

نظـــــــــــــــــر شما چیه ؟
سلام.
همونطور که خودتون هم به درستی اشاره کردید، مشکل بخاطر انتخاب در ابزار و روش نامناسب هست و البته منطقی هم نیست که یکبار در formload و یکبار هم در active یک عمل تکراری صورت بگیره.
فرض بگیریم که دو فرم داشته باشید که در فرم1 دیتاگریدی دارید (dataGridview1) که اطلاعات رو نمایش میده و در فرم2 هم اطلاعات مربوط به فرم1 رو ویرایش (یا درج یا حذف) می کنید که می خواید بعد از هر تغییری سریعا اطلاعات به گرید فرم 1 منتقل بشه (حتی بدون بستن فرم2) و با فرض اینکه از درون فرم 1، فرم 2 رو صدا می زنید (منظور همون show یا showdialog کردن فرم هست).
حالا کافیه مراحل زیر رو انجام بدید :
در فرم 2 :
یک پراپرتی از جنس DataGridView که شامل بدنه get و Set هست رو بصورت سراسری تعریف کنید.

private DataGridView dgv = new DataGridView();
public DataGridView Dgv
{
get { return dgv; }
set { dgv = value; }
}
حالا بعد از هر کد درج، حذف یا آپدیت که تغییرات روی جدولتون صورت میگیره این دیتاگریدویو (dgv) رو با یک select از جدول مربوطه پر کنید (مثل همیشه که یک گرید رو پر می کنید).
توی این فرم کار تمومه.
در فرم 1 :
درون این فرم هم یک تکه کد کوتاه رو باید قبل از show یا showdialog کردن فرم 2 قرار بدید (با رنگ قرمز مشخص هست) :

Form2 f2 = new Form2();
f2.Dgv = dataGridView1;
f2.ShowDialog();
نکته : اگر هم از طریق form1 اقدام به نمایش form2 نمی کنید به عبارتی یک فرم اصلی دارید که از اونجا اقدام به نمایش فرم ها می کنید (مثلا از طریق یک menustrip) می تونید در form2 پراپرتی رو بصورت static تعریف کنید و در formload مربوط به form1 ، عمل انتساب گریدها رو انجام بدید :

Form2.Dgv = dataGridView1;
سعی کردم که با توضیحات کامل مطلب رو شرح بدم که ابهامی براتون پیش نیاد.
موفق باشید.

farzad_1354
پنج شنبه 18 مهر 1398, 22:33 عصر
سلام

معمولا gridview زمانیکه AutosizeRowMode رو روی Allcell تنظیم کنی سرعت لود رکوردها فوق العاده پایین میاد ، اگر اینطوره روی None بزار
من این مشکل و داشتم حل شد ، الان 1 میلیون رکورد هم لود میشه در عرض چند ثانیه

موفق باشید