رفرش کردن یک لیبل

diehard2007

عضو جدید
با سلام و خسته نباشید من در برنامم یه قسمتی دارم که اطلاعات مشتری رو ثبت می کنم و در فرم اصلی تعداد مشتریها را نشان می ده مثلا اگر 10 باشه و من 5 تا مشتری جدید ثبت کنم بازم تعداد 10 رو نشون می ده اما از برنامه میام بیرون دوباره می رم داخل برنامه می زنه 15 حالا چطور می شه تو همون لحظه که دوباره برمی گردم به فرم اصلی تعداد را درست برگردونه در ضمن من از این کد استفاده می کنم :

DataTable dt2 = new DataTable();
OleDbConnection cn2 = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Mobile.mdb;Persist Security Info=True");
cn2.Open();
OleDbCommand cmd2 = new OleDbCommand("SELECT CustomerID FROM Customers", cn2);
OleDbDataAdapter da2 = new OleDbDataAdapter(cmd2);
da2.Fill(dt2);
if (dt2.Rows.Count > 0)
{
lblVorodiTaEmrooz.Text = "" + dt2.Rows.Count;
}
cn2.Close();
 

RIG

متخصص C#.net
میتونی تو یه دکمه تو فرم اصلی بذاری به اسم refresh که اطلاعات رو لود کنی باهاش یا از تایمر استفاده کنی که هر لحظه برات یه سلکت انجام بده. که زیاد عاقلانه نیست البته به نظر من . شما داری اطلاعات رو در گرید نشون میدی الان .جدا از این سوالت همین جوری یه راهنمایی کنم. اگه اطلاعاتت خیلی بیشتر بشه و باید تو گرید لود شه مثلا 1000 تا مشتری و ... که متوالی اضافه میشه گرید موقعه لودش نمی تونه به سرعت لود کنه و not responding رخ میده . شما باید واسه جلو گیری از این کار تا میتونین کد ها رو بهینه بنویسید و سپس از therd , backgrondworker استفاده کنید. سرچ گنی پیدا میشه . توضیحات جهت اینکه دوستا ن چیزی رو اگه نمی دونن یاد بگیرن چون خودم این مشکل رو داشتم قبلا .
 

کربلایی

مدیر بازنشسته
با سلام و خسته نباشید من در برنامم یه قسمتی دارم که اطلاعات مشتری رو ثبت می کنم و در فرم اصلی تعداد مشتریها را نشان می ده مثلا اگر 10 باشه و من 5 تا مشتری جدید ثبت کنم بازم تعداد 10 رو نشون می ده اما از برنامه میام بیرون دوباره می رم داخل برنامه می زنه 15 حالا چطور می شه تو همون لحظه که دوباره برمی گردم به فرم اصلی تعداد را درست برگردونه در ضمن من از این کد استفاده می کنم :

DataTable dt2 = new DataTable();
OleDbConnection cn2 = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Mobile.mdb;Persist Security Info=True");
cn2.Open();
OleDbCommand cmd2 = new OleDbCommand("SELECT CustomerID FROM Customers", cn2);
OleDbDataAdapter da2 = new OleDbDataAdapter(cmd2);
da2.Fill(dt2);
if (dt2.Rows.Count > 0)
{
lblVorodiTaEmrooz.Text = "" + dt2.Rows.Count;
}
cn2.Close();

به نظر من بهتره در پایگاه داده تون یک فیلد بزارید و تعداد مشتری هاتون رو در اون ذخیره کنید، بعد در برنامه خاصیت Text لیبل رو به اون فیلد Bind کنید.
اگر با Binding آشنایی ندارید بگید تا نمونه بزارم
موفق باشید
 

diehard2007

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

کربلایی

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

اول در برنامه ات یک دیتا ویو بساز:
کد:
DataView MyDataView;

بعد در لودینگ فرم اصلیت دیتا ویو بالایی رو نمونه سازی کن
کد:
MyDataView = new DataView(MyDataset.MyTable);

درادامه لیبلت رو به اون فیلدی که میخوای بیند کن
کد:
MyLabel.DataBindings.Clear();
            MyLabel.DataBindings.Add("Text", MyDataView, "MyField");

با اینکار هر وقت که مقدار MyField آپدیت بشه برنامه خودکار مقدار Text لیبلت رو آپ میکنه و نیازی به ریفرش و کارای اضافه نداری
 

کربلایی

مدیر بازنشسته
یک راه دیگه اینه که بیای یه متغیر عمومی و استاتیک تعریف کنی
مقدار اولیه این متغییر رو برابر با تعداد مشتری های فعلی بزاری
و با هر بار وارد کردن مشتری جدید مقدارش رو یک واحد بیشتر کنی
بعد مقدار تکست لیبلت رو مساوی اون متغییر بکنی
 

diehard2007

عضو جدید
دوباره سلام از این خط ایراد می گیره : در ضمن میشه یه نمونه کد بذارید ممنون می شم
MyDataView = new DataView(MyDataset.MyTable);
 

کربلایی

مدیر بازنشسته
دوباره سلام از این خط ایراد می گیره : در ضمن میشه یه نمونه کد بذارید ممنون می شم
MyDataView = new DataView(MyDataset.MyTable);

احتمالا خطا بخاطر اینه که شما دیتاستی بنام MyDataset تعریف نکردید.
در ضمیمه یک مثال براتون گذاشته ام.
در این مثال یک متغیر در فرم 1 تعریف کرده ام که در فرم 2 با افزودن مشتری جدید مقدارش یک واحد افزدوده میشه و هنگام برگشت به فرم1 در لیبل نمایش داده میشه.
البته این فقط برای مثال هست و من دیتاست رو آپدیت نکرده ام
شما خودتون با توجه به نیازتون تغییرش بدین.
موفق باشید
 

پیوست ها

  • TestForY.rar
    748.8 کیلوبایت · بازدیدها: 0

diehard2007

عضو جدید
سلام دوست عزیز یک دنیا ممنون ، مشکل حل شد خدا خیرت بده واقعا یکی از بهترین سایتا هستید .
 

diehard2007

عضو جدید
آقا دوباره سلام مثل اینکه این مشکل ما نمی خواد هیچ موقع درست بشه . من از کدی که شما زحمتشو کشید استفاده کردم ولی یادم رفت بگم که من از این کد در 2 جا استفاده می کنم یکی برای گوشیهای وارد شده به تعمیرگاه و یکی برای گوشیهای تعمیر شده در قسمت گوشیهای وارد شده اگه 2 تا گوشی اومده باشه می زنه 2 و اگه همون 2 تا گوشی رو اطلاعات دیگشو تکمیل کنم باز اون 2 گوشی تعمیر شده رو با 2 گوشی که وارد تعمیرگاه شده رو جمع می کنه یعنی تعداد 2 رو با 2 جمع می کنه عوض اینکه 2 برگردونه 4 بر می گردونه
در ضمن من تو فرم main از این کد استفاده می کنم :

Private void frmMain_Load(object sender, EventArgs e)
{

cmd2 = new OleDbCommand("SELECT * FROM Repairs", cn2);
cn2.Open();
da2 = new OleDbDataAdapter(cmd2);
da2.Fill(ds2);
if (ds2.Tables[0].Rows.Count > 0)
{
RepairID = ds2.Tables[0].Rows.Count;
lblVorodi.Text = "" + RepairID.ToString();
}
cmd2 = new OleDbCommand("SELECT * FROM Customers", cn2);
da2 = new OleDbDataAdapter(cmd2);
da2.Fill(ds2);
if (ds2.Tables[0].Rows.Count > 0)
{
CustomerID = ds2.Tables[0].Rows.Count;
lblVorodiTaEmrooz.Text = "" + CustomerID.ToString();
}
cn2.Close();
}

در فرم Customers از این کد استفاده می کنم

private void btnAdd_Click(object sender, EventArgs e)
{
DataRow dr = ds2.Tables[0].NewRow();
frmMain.CustomerID +=1;
dr["CustomerID"] = frmMain.CustomerID;
dr["CustomerName"] = txtName.Text;
dr["PhoneModel"] = txtModel.Text;
dr["SerialNumber"] = txtSerialNumber.Text;
dr["Problem"] = txtProblem.Text;
dr["VaziyateZaheri"] = txtVaziyateZaheri.Text;
dr["ShomareTamas"] = txtShomareTamas.Text;
dr["VasayeleHamrah"] = rtxtVasayeleHamrah.Text;
dr["LoginDate"] = txtLoginDate.Text;
dr["LoginTime"] = txtTime.Text;
dr["Description"] = richDescription.Text;
ds2.Tables[0].Rows.Add(dr);
if (txtName.Text == "" || txtModel.Text == "" || txtProblem.Text == "" || txtSerialNumber.Text == "" || txtShomareTamas.Text == "")
{
FMessegeBox.FarsiMessegeBox.Show("لطفا فیلدهای ستاره دار را مقداردهی نمائید", "اخطار", FMessegeBox.FMessegeBoxButtons.Ok, FMessegeBox.FMessegeBoxIcons.Exclamtion);
}
else if (FMessegeBox.FarsiMessegeBox.Show("آیا مایل به ذخیره اطلاعات برای مشتری جدید هستید ؟", "ثبت مشتری جدید", FMessegeBox.FMessegeBoxButtons.YesNo, FMessegeBox.FMessegeBoxIcons.Question) == DialogResult.Yes)
{
OleDbConnection cn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Mobile.mdb;Persist Security Info=True");
cn.Open();
OleDbCommand cm = new OleDbCommand("insert into Customers(CustomerName,PhoneModel,SerialNumber,Problem,VaziyateZaheri,ShomareTamas,VasayeleHamrah,LoginDate,LoginTime,Description) values('" + txtName.Text + "','" + txtModel.Text + "','" + txtSerialNumber.Text + "','" + txtProblem.Text + "','" + txtVaziyateZaheri.Text + "','" + txtShomareTamas.Text + "','" + rtxtVasayeleHamrah.Text + "','" + txtLoginDate.Text + "','" + txtTime.Text + "','" + richDescription.Text + "')", cn);
cm.ExecuteNonQuery();
cn.Close();
FMessegeBox.FarsiMessegeBox.Show("اطلاعات مشتری جدید با مؤفقیت ذخیره شد", " مشتری جدید");
ShowData();
frmCustomers_Load(null, null);
txtModel.Clear();
txtName.Clear();
txtProblem.Clear();
txtSerialNumber.Clear();
txtShomareTamas.Clear();
txtVaziyateZaheri.Clear();
rtxtVasayeleHamrah.Clear();
richDescription.Clear();
}
}


و در فرم Repairs از این کد استفاده می کنم

private void btnAdd_Click(object sender, EventArgs e)
{
DataRow dr = ds2.Tables[0].NewRow();
frmMain.RepairID += 1;
dr["RepairID"] = frmMain.RepairID;
dr["CustomerID"] = frmMain.RepairID;
dr["Tamirkar"] = frmMain.RepairID;
dr["GheteeMasrafi"] = frmMain.RepairID;
dr["GheymatehGheteeMasrafi"] = frmMain.RepairID;
dr["Price"] = frmMain.RepairID;
dr["SharheTamir"] = frmMain.RepairID;
dr["LogOutDate"] = frmMain.RepairID;
dr["LogOutTime"] = frmMain.RepairID;
ds2.Tables[0].Rows.Add(dr);
if (cbGhabz.Text == "" || txtTamirkar.Text == "" || txtHazine.Text == ""||txtGheymateGhetee.Text=="")
{
FMessegeBox.FarsiMessegeBox.Show("لطفا فیلدهای ستاره دار را مقداردهی نمائید", "اخطار", FMessegeBox.FMessegeBoxButtons.Ok, FMessegeBox.FMessegeBoxIcons.Exclamtion);
}
else if (FMessegeBox.FarsiMessegeBox.Show("آیا مایل به ذخیره گوشی تعمیر شده جدید هستید ؟", "ذخیره گوشی تعمیر شده جدید", FMessegeBox.FMessegeBoxButtons.YesNo, FMessegeBox.FMessegeBoxIcons.Question) == DialogResult.Yes)
{
ds2.Clear();
da.SelectCommand.CommandText = "select CustomerID from Repairs where CustomerID="+cbGhabz.Text+"";
da.Fill(ds2,"CustomerID");
if (ds2.Tables["CustomerID"].Rows.Count > 0)
{
DialogResult d = FMessegeBox.FarsiMessegeBox.Show("این شماره قبض قبلا ثبت شده است ، لطفا شماره قبض را با دقت وارد نمائید", "اخطار", FMessegeBox.FMessegeBoxButtons.Ok, FMessegeBox.FMessegeBoxIcons.Error);
}
else
{
DataBase db = new DataBase();
db.DoCommand("insert into Repairs(CustomerID,Tamirkar, GheteeMasrafi, GheymatehGheteeMasrafi, Price, SharheTamir, LogOutDate,LogOutTime)" + " values ("+cbGhabz.Text+",'" + txtTamirkar.Text + "','" + txtGhetee.Text + "','" + txtGheymateGhetee.Text + "','" + txtHazine.Text + "','" + rtbSharheTamir.Text + "','" + txtDate.Text + "','" + txtTime.Text + "')");
frmRepairs_Load(sender, e);
dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.RowCount - 2].Cells[1];
FMessegeBox.FarsiMessegeBox.Show("گوشی تعمیر شده جدید با مؤفقیت ذخیره شد", "گوشی تعمیر شده جدید");
txtGhetee.Clear();
txtHazine.Clear();
txtTamirkar.Clear();
rtbSharheTamir.Clear();
txtGheymateGhetee.Text = "0";
}
}
}
 

کربلایی

مدیر بازنشسته
سلام
من دقیقا متوجه سوال شما نشدم!
1- سوالتون رو واضحتر بپرسید
2- دیتا بیسی که استفاده میکنید رو به همراه کل پروژه بزارید اینجا تا بررسی کنیم

موفق باشید
 

diehard2007

عضو جدید
سلام دوست عزیز متاسفانه نمی تونم پروژه رو آپلود کنم بدلیل حجم سنگین پروژه امکانش نیست
سوالم این بود : من در یه جا تو فرم اصلی روی دکمه ثبت مشتری کلیک می کنم و فرم مشتری باز می شه که چند تا تکست باکس داره که اطلاعات رو ذخیره می کنم بدون هیچ مشکلی و باز در فرم اصلی برنامه روی گوشیهای تعمیره شده کلیک می کنم و فرمش باز می شه و باز چندتا تکست باکس گذاشتم که اطلاعاتو ذخیره می کنه
بطور مثال من 2 تا گوشی در سیستم ذخیره کردم یعنی نصف اطلاعات مثل : شماره قبض - نام مشتری - شماره تماس - مدل گوشی - شماره سریال و غیره رو ثبت می کنم
نصف دیگش که در فرم گوشیهای تعمیره شده است مثل : شماه قبض - نام تعمیر کار - هزینه تعمیر و غیره
حالا اگه تو فرم مشتری جدید 2 تا رکورد ذخیره شده باشه و تو فرم گوشیهای تعمیر شده 1 رکورد ثبت بشه می زنه تعداد گوشیهای ورودی تا امروز 3 ولی در اصل 2 هست نه 3 حالا اگه یه رکورد دیگه در فرم گوشیهای تعمیره شده ذخیره کنم می زنه 4 یعنی 2 تا مشتری رو با گوشیهای تعمیره شده جمع می کنه .
 

کربلایی

مدیر بازنشسته
متغیر های CostumerİD و RepireİD رو حذف کن
در رویداد Activated فرم اصلی برنامه کد زیر رو بنویس
کد:
lblVorodiTaEmrooz.Text = ds2.Tables[0].Rows.Count.ToString();
 

hoseng

کاربر بیش فعال
دوباره سلام از این خط ایراد می گیره : در ضمن میشه یه نمونه کد بذارید ممنون می شم
MyDataView = new DataView(MyDataset.MyTable);
من فکر میکنم طزیقه استفاده از این خط کد به این صورته myDataView=new DataView(MyDataSet.Tables["name of table in data set"]l یعنی وقتی دیتاست رو پر میکنید و نام جدول براش در نظر میگیرد نام اون جدول باید در تعریف دیتا ویو بیاد
در ضمن فکر میکنم برای اینکه لیبلتون رفرش شه قبل از رفرش باید اطلاعاتی که جدیدا در دیتابیس ثبت کردین رو دوباره در دیتا ست بریزین یعنی ابتدا دیتاست رو رفرش کنین
بازم از استادای عزیزم عذر میخوام که دخالت کردم
 

negin17h

مدیر تالارهای مهندسی کامپیوتر و رباتیکمتخصص #C
مدیر تالار
من فکر میکنم طزیقه استفاده از این خط کد به این صورته myDataView=new DataView(MyDataSet.Tables["name of table in data set"]l یعنی وقتی دیتاست رو پر میکنید و نام جدول براش در نظر میگیرد نام اون جدول باید در تعریف دیتا ویو بیاد
در ضمن فکر میکنم برای اینکه لیبلتون رفرش شه قبل از رفرش باید اطلاعاتی که جدیدا در دیتابیس ثبت کردین رو دوباره در دیتا ست بریزین یعنی ابتدا دیتاست رو رفرش کنین
بازم از استادای عزیزم عذر میخوام که دخالت کردم

حرف شما درست هست و ارجاع به جداول با نام آن ها بهتر از ایندکس است :gol:
 

diehard2007

عضو جدید
سلام دوست عزیز فرض کنید من یه همچین چیزی دارم و می خوام زمانیکه یه مشتری جدید اضافه کردم توی صفحه اضلی بزنه تعداد گوشیهای ورودی تا امروز : 1 و اگه پاکش کردم بزنه 0 . در قسمت گوشیهای تعمیر شده من یه relation بین دو جدول Customers,Repairs همون طور که در پروژه مشخصه گذاشتم و CustomerID جدول Customers رو به CustomerID جدول Repairs وصل کردم حالا می خوام در قسمت گوشیهای تعمیر شده اگه یه گوشی تعمیر شده تو صفحه اصلی بزنه تعداد گوشیهای تعمیر شده : 1 و اگر هم دوباره پاکش کردم بزنه صفر در ضمن فایل رو هم آپلود کردم
 

پیوست ها

  • TestMobile.rar
    61.4 کیلوبایت · بازدیدها: 0

hoseng

کاربر بیش فعال
سلام دوست عزیز فرض کنید من یه همچین چیزی دارم و می خوام زمانیکه یه مشتری جدید اضافه کردم توی صفحه اضلی بزنه تعداد گوشیهای ورودی تا امروز : 1 و اگه پاکش کردم بزنه 0 . در قسمت گوشیهای تعمیر شده من یه relation بین دو جدول Customers,Repairs همون طور که در پروژه مشخصه گذاشتم و CustomerID جدول Customers رو به CustomerID جدول Repairs وصل کردم حالا می خوام در قسمت گوشیهای تعمیر شده اگه یه گوشی تعمیر شده تو صفحه اصلی بزنه تعداد گوشیهای تعمیر شده : 1 و اگر هم دوباره پاکش کردم بزنه صفر در ضمن فایل رو هم آپلود کردم
ببین دوست عزیزم شما الان مشکلت اینه که وقتی ویرایشی تو دیتابیست اتفاق می افته لیبل ها اون تغییر رو نشون نمیدن،درسته؟
من نتونستم فایلت رو دانلود کنم ولی چند تا نکته رو میگم شاید بتونه کاری کنه (فرض رو بر این میذارم که query هایی که نوشتی ایرادی نداشته باشن و به درستی به دیتابیس وصل شی و اطلاعات رو تغییر بدی)
پس شما بعد از اینکه کنترل های دلخواهتون مثل لیبل رو به DataSet وصل کردین با استفاده ازکد:
Lable1.DataBinding.Add("property value",data source,"data member")
بعدش اگر اون کدهایی رو که باعث وصل شدن برنامه به دیتابیس و انتقال اونا به دیتا ست میشه رو تو یک تابع جداگونه بنویسی میتونی بعد از هر تغییری که در دیتابیست میدی یک بار این تابع رو فراخونی کنی تا اطلاعات جدید ایتدا به دیتاست و به دنبال اون به لیبل مشخص شده انتقال پیدا کنه
امیدوارم مفید بوده باشه
 

RIG

متخصص C#.net
شما بیا یه کاری کن . یا مجدد فراخونی کن کدی رو که باهاش محتویاتو رو تو لیبل نشون میدی و یا تو یه تایمر بنداز .
سوال دومتم .پیک.
 

پیوست ها

  • del.jpg
    del.jpg
    35.5 کیلوبایت · بازدیدها: 0

diehard2007

عضو جدید
می شه اون فایل رو دانلود کنید حجمی هم نداره مشکل من اینجاست که اگه تعداد کل گوشیهای ورودی 2 باشه و بعد بیام اون 2 تایی که نیمی از اطلاعاتش رو در سیستم ذخیره کردم و بعد نیمی دیگه از اطلاعاتشو که ذخیره می کنم یعنی یه لیبل گذاشتم که می زنه تعداد گوشیهای تعمیر شده 2 حالا اگه از برنامه بیام بیرون و دوباره برم بجای اینکه بزنه تعداد کل گوشیهای وارد شده تا به امروز :2 می زنه 4 یعنی اون 2 تا گوشیهای تعمیر شده رو با خودش جمع می کنه مشکل من اینجاست خواهش می کنم پروژه رو نگاه کنید شاید مشکل از سمت بانکم باشه
 

kerberos2023

عضو جدید
می شه اون فایل رو دانلود کنید حجمی هم نداره مشکل من اینجاست که اگه تعداد کل گوشیهای ورودی 2 باشه و بعد بیام اون 2 تایی که نیمی از اطلاعاتش رو در سیستم ذخیره کردم و بعد نیمی دیگه از اطلاعاتشو که ذخیره می کنم یعنی یه لیبل گذاشتم که می زنه تعداد گوشیهای تعمیر شده 2 حالا اگه از برنامه بیام بیرون و دوباره برم بجای اینکه بزنه تعداد کل گوشیهای وارد شده تا به امروز :2 می زنه 4 یعنی اون 2 تا گوشیهای تعمیر شده رو با خودش جمع می کنه مشکل من اینجاست خواهش می کنم پروژه رو نگاه کنید شاید مشکل از سمت بانکم باشه
شما باید کد sql رو تغییر بدی
یعنی گوشی های تعمیر شده، تعمیر نشده، خروجی و . . . رو جدا جدا واکشی کنی و در لیبل هات قرار بدی
در ضمن بهتره برای تعداد گوشی ها از تابع count(*) استفاده کنی نه ID فیلد چون ممکنه که آی دی درست نباشه
من اگه جای شما باشم یه جدول برای تمام گوشی ها درست می کنم و با یک فیلد گوشی های ورودی، خروجی، تعمیری و ... از هم جدا میکنم با استفاده از تابع count و where تعداد هر کدوم رو مشخص می کنم
 
آخرین ویرایش:

Similar threads

بالا