yasercomeng
پنج شنبه 07 شهریور 1387, 01:13 صبح
سلام من يه برنامه نوشتم كه از دو تا فرم تشكليل شده فرم اول فرم دوم را با متد Show() نمايش مي دهد تا قابليت حركت بين اين دو فرم فراهم شود. مادامي كه فرم اول كار خودشو انجام مي ده مي خوام كه فرم دوم يه سري اطلاعات رو از پايگاه بهم نشون بده مثلاً اگه فرض كنيم كه ما وارد فرم مدير شديم مي خوايم كه تو فرم دوم ميزان فروش يك ساعت پيش را ملاحظه كنيم. خب براي اين كار من مي خوام از threading استفاده كنم اما يه كمي دچار مشكل شدم. در واقع به نظر مدل كدينگم اشتباه است. حالا كمكي كه از شما مي خوام اينه كه كدا رو ببينيد بهم بگين براي اين كار بايد چه كار كنم. از راهنماييتون متشكرم.
اين كد رويداد Load مربوط به فرم مدير:
private void manager_Load(object sender, EventArgs e)
{
ManagerNotifyCost MNC = new ManagerNotifyCost();
MNC.Show();
}
اينم كد مربوط به فرم ManagerNotifyCost
يه نكته اينكه من تو اين كد من از دو تا ليبل (PlaceLablel,CostLabel) براي نمايش اطلاعات استفاده مي كنم.
يه نكته ي ديگه اين فرم وقتي تك باشد به درستي اعمالش رو انجام مي ده ولي وقتي با اون متد show فراخواني مي شه ديگه درست كار نمي كنه:
public partial class ManagerNotifyCost : Form
{
delegate void SetTextCallBack(string Cost, string Place);
MySqlCommand Command = new MySqlCommand();
MySqlConnection Connection=new MySqlConnection(/*my connection string*/);
MySqlDataReader Reader;
public ManagerNotifyCost()
{
InitializeComponent();
}
private void ManagerNotifyCost_Load(object sender, EventArgs e)
{
Thread ShowCost = new Thread(new ThreadStart(ShowingCost));
ShowCost.Start();
}
private void SetText(string Cost, string Place)
{
if (PlaceLabel.InvokeRequired)
{
SetTextCallBack Text = new SetTextCallBack(SetText);
this.Invoke(Text, new object[] { Cost, Place });
}
else
{
this.CostLabel.Text = "فروشگاه";
this.PlaceLabel.Text = Cost;
break;
}
}
private void ShowingCost()
{
lock (this)
{
int Cost = 0;
Command.Connection = library.Connection;
while (this.Visible)
{
Connection.Open();
Cost = 0;
//this is a place that information retrieve from DB
this.SetText(Cost.ToString(), "shop");
Connection.Close();
}
}
}
}
اين كد رويداد Load مربوط به فرم مدير:
private void manager_Load(object sender, EventArgs e)
{
ManagerNotifyCost MNC = new ManagerNotifyCost();
MNC.Show();
}
اينم كد مربوط به فرم ManagerNotifyCost
يه نكته اينكه من تو اين كد من از دو تا ليبل (PlaceLablel,CostLabel) براي نمايش اطلاعات استفاده مي كنم.
يه نكته ي ديگه اين فرم وقتي تك باشد به درستي اعمالش رو انجام مي ده ولي وقتي با اون متد show فراخواني مي شه ديگه درست كار نمي كنه:
public partial class ManagerNotifyCost : Form
{
delegate void SetTextCallBack(string Cost, string Place);
MySqlCommand Command = new MySqlCommand();
MySqlConnection Connection=new MySqlConnection(/*my connection string*/);
MySqlDataReader Reader;
public ManagerNotifyCost()
{
InitializeComponent();
}
private void ManagerNotifyCost_Load(object sender, EventArgs e)
{
Thread ShowCost = new Thread(new ThreadStart(ShowingCost));
ShowCost.Start();
}
private void SetText(string Cost, string Place)
{
if (PlaceLabel.InvokeRequired)
{
SetTextCallBack Text = new SetTextCallBack(SetText);
this.Invoke(Text, new object[] { Cost, Place });
}
else
{
this.CostLabel.Text = "فروشگاه";
this.PlaceLabel.Text = Cost;
break;
}
}
private void ShowingCost()
{
lock (this)
{
int Cost = 0;
Command.Connection = library.Connection;
while (this.Visible)
{
Connection.Open();
Cost = 0;
//this is a place that information retrieve from DB
this.SetText(Cost.ToString(), "shop");
Connection.Close();
}
}
}
}