PDA

View Full Version : مشکل اضافه شدن رکورد ولی نمایش ندادن در گرید



Fastdesign
شنبه 04 آذر 1391, 12:39 عصر
با سلام

مشکل : دوتا فرم دارم و یک گرید در فرم اول قرار داره . حالا با این کدها که پایین قرار دادم تو فرم اول اگه رکوردی رو اضافه کنم فورا رکورد اضافه شده برام تو گرید نمایش داده میشه ولی اگه با این کد تو فرم دوم رکورد رو اضافه کنم تو گرید که تو فرم اول قرار داره نمایش داده نمیشه مگر اینکه از برنامه خارج بشم !

این متغیرها رو به صورت سراسری تو هر دوتا فرم تعریف کردم :
OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Database.mdb");
OleDbDataAdapter da = new OleDbDataAdapter();
DataTable dt = new DataTable();
BindingSource bs = new BindingSource();
OleDbCommand cmd = new OleDbCommand();

این کد ها تو خاطیت لود فرم نوشتم :
da = new OleDbDataAdapter("select * from phon", con);
da.Fill(dt);
bs.DataSource = dt;
dataGridView1.DataSource = bs;

این کدها هم برای اضافه کردن رکورد :
con.Open();
string s = "insert into Phon(F_name,L_name)values('"+textBox1.Text+"','"+textBox2.Text+"')";
OleDbCommand addq = new OleDbCommand(s,con);
addq.ExecuteNonQuery();
dt.Clear();
da.Fill(dt);
con.Close()

به نظر شما مشکل از چیه؟

با تشکر

veniz2008
شنبه 04 آذر 1391, 12:53 عصر
سلام. ببینید رویداد FormLoad زمانیکه فرم اجرا میشه، یه عملی رو که ما بهش میگیم انجام میده. بنابراین زمانیکه فرم 1 و فرم 2 در حالت اجرا هستن شما با بستن فرم 2، نمیتونید از رویداد formload بصورت معمول استفاده کنید. یه راهش میتونه این باشه که در رویداد FormActivate مربوط به فرم1،کدهای مربوط به پر کردن گرید رو بزارید ( یعنی همون کدهایی که در فرم لود گذاشتید).

Fastdesign
شنبه 04 آذر 1391, 16:09 عصر
داش من این کار رو انجام دادم ولی مشکل از جای دیگه است !

شما خودتون این کدها رو تست کنید ببینین مشکل از چیه !

Fastdesign
شنبه 04 آذر 1391, 18:52 عصر
دوستان کسی نیست راهنمایی کنه ! ما تو سی شارپ تازه کار هستیم !:لبخندساده:

plus
شنبه 04 آذر 1391, 19:06 عصر
کدوم قسمت از کد رو توی فرم دوم مینویسین؟ اگه این قسمت رو توی فرم دوم مینویسی:




con.Open();
string s = "insert into Phon(F_name,L_name)values('"+textBox1.Text+"','"+t extBox2.Text+"')";
OleDbCommand addq = new OleDbCommand(s,con);
addq.ExecuteNonQuery();
dt.Clear();
da.Fill(dt);
con.Close()

و بقیه رو تو لود فرم اول، متغییر dt توی کدوم فرم ایجاد شده و چطوری توی هر فرم بهش دسترسی پیدا میکنید؟

Fastdesign
شنبه 04 آذر 1391, 19:33 عصر
دوست عزیز من کدهای قسمت اول و قسمت دوم پست 1 رو تو هر دو فرم تعریف کردم یعنی dt هم تو فرم اول ایجاد میشه و هم تو فرم دوم .

مشکل من اینه که وقتی از طریق فرم دوم می خوام رکوردی رو اضافه کنم تو فرم اول به گرید اضافه نمیشه ! ولی اگه با همون کد تو فرم اول رکوردی رو اضافه کنم فورا برام تو گرید نمایش داده میشه !

ممنونم از اینکه به سوالم توجه کردی

plus
شنبه 04 آذر 1391, 20:24 عصر
خوب دیتاگریدویو نمیتونه همزمان به دو تا DataTable متصل باشه که...با کاری که شما میکنی حتما دیتاگریدویو به DataTable توی فرم اول Bind شده بعد شما توی فرم دوم DataTable فرم دوم رو ویرایش میکنی که هیچ تاثیری روی اولی نمیذاره.بعدم، شما توی فرم دوم چطوری به DataGridView توی فرم اول دسترسی پیدا میکنید تا بتونید بخش دوم کدتون رو بنویسید؟

Fastdesign
شنبه 04 آذر 1391, 20:31 عصر
دوست عزیز من خیلی وقت نیست سی شارپ رو شروع کردم قبلا با دلفی برنامه می نوشتم . چون تا حالا سی شارپ کار نکردم زیاد تو سی شارپ وارد نیستم فقط می دونم بانک اطلاعاتی تو دلفی و سی شارپ خیلی متفاوته !

خب بگذریم ! حالا من باید چکار کنم برای اینکار !
اگه میشه نمونه کد بزارید .


با تشکر

plus
شنبه 04 آذر 1391, 21:09 عصر
خوب میشه توضیح بدین دقیقا میخواین چیکار کنید تا ببینم میتونم کمکتون کنم؟

sgh_programer
شنبه 04 آذر 1391, 21:21 عصر
سلام

وقتی که فرم دومت نمایش داده میشه کد های فوق را بعد از نمایش فرمت بذار


da = new OleDbDataAdapter("select * from phon", con);
da.Fill(dt);
bs.DataSource = dt;
dataGridView1.DataSource = bs;




به این مثال توجه کن

Form2 frm2 = new Form2();
frm2.ShowDialog();
da = new OleDbDataAdapter("select * from phon", con);
da.Fill(dt);
bs.DataSource = dt;
dataGridView1.DataSource = bs;



حتما تست کن ببین نتیجه چه میشه

Fastdesign
شنبه 04 آذر 1391, 21:36 عصر
دوست من بازهم نمایش داده نمیشه!

اگه میشه یک نمونه مثال بزار

sgh_programer
شنبه 04 آذر 1391, 21:39 عصر
شما یه نمونه از این کد ها رو که نوشتید و مشکل داره رو بذار تا دوستان براتون اصلاح کنن

Fastdesign
یک شنبه 05 آذر 1391, 07:28 صبح
این هم نمونه کد :

95559

تو برنامه دو تا فرم دارم گه گرید تو فرم اول قرار داره .

veniz2008
یک شنبه 05 آذر 1391, 08:01 صبح
یه روش رو قدم به قدم توضیح میدم. امیدوارم مشکلتون حل بشه. این روش به این صورت هست که در فرم1 گریدویو وجود داره و در فرم2 هم اشخاص اضافه میشن. به محض اضافه شدن یک شخص، میتونید اونو در فرم1 مشاهده کنید ( بدون اینکه حتی فرم2 رو ببندید).در این مثال، من گرید مربوط به فرم 1 رو Grduser در نظر گرفتم. مراحل کار بصورت زیر هست:
1. در فرم2( فرمی که اشخاص رو اضافه می کنید) و در بخش partial class یک گرید رو بصورت عمومی و به شکل زیر تعریف کنید:

DataGridView grdnewuser = new DataGridView();
روی کلمه grdnewuser ، راست کلیک کنید و از گزینه Refactor ، گزینه Encapsulate Field رو انتخاب کنید.در پنجره باز شده کلید Ok رو بزنید. با انجام این کارها، بصورت اتوماتیک یه تابع get و set در زیر همین خط ایجاد میشه ( اصلا با این مورد هیچ کاری نداشته باشید و خودتون رو درگیر اون نکنید).
2. در فرم 1 و اون جایی که فرم2 رو صدا میزنید ( یعنی همون جایی که فرم2 رو new و show می کنید) یک خط کد باید اضافه کنید، ابتدا فرض کنید که فرم 2 رو بصورت زیر صدا بزنیم:

Form2 FrmNewUser = new Form2();
FrmNewUser.ShowDialog();
حالا قبل از show کردن کد زیر رو اضافه کنید :

FrmNewUser.Grdnewuser = Grduser;
یعنی در نهایت باید کد زیر رو داشته باشید :

Form2 FrmNewUser = new Form2();
FrmNewUser.Grdnewuser = Grduser;
FrmNewUser.ShowDialog();
حالا درون دکمه اضافه کردن کاربر (که در فرم 2 قرار داره) و در انتهای کدهای اضافه کردن ، این کدها رو اضافه کنید :

da = new OleDbDataAdapter("select * from phon", con);
DataTable dt = new DataTable();
da.Fill(dt);
Grdnewuser.DataSource = dt;

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

Fastdesign
یک شنبه 05 آذر 1391, 10:48 صبح
من این کار رو انجام دادم بازهم نشد . برنامه رو اینجا گذاشتم شما یه نگاهی بهش بندازید .

تو فرم اول یک Button قرار داره که میشه فرم دوم را نمایش داد .
95562

veniz2008
یک شنبه 05 آذر 1391, 12:10 عصر
مشکلی که برای شما پیش اومده اینه gridphon رو موقع تعریف کردن با G (بزرگ) شروع کردید. در این حالت یه سردرگمی پیش میاد چون خود ویژوال استودیو به جای Gridphon، متد Gridphon1 رو میسازه.(البته باید این نکته رو در پست قبلی توضیح میدادم که متاسفانه فراموش کردم، مشکل از من بود).
برای حل مشکل دو راه دارید : 1. یه بار از نو مراحل رو انجام بدید. فقط حروف رو بصورت کوچک بنویسید و بعد refactor و سایر مراحلی که گفتم ( پیشنهاد میکنم از همین راه استفاده کنید)
2. در فرم2 و اونجایی که کدها رو بعد از اضافه کردن نوشتید عدد 1 رو از Gridphon بردارید یعنی :

Gridphon.DataSource = dt;
راستی بعد از اضافه کردن،خالی کردن دیتاتیبل و پر کردن آداپتور واسه چیه؟؟؟.
اینطور بنویسید دوست من :

string s = "insert into Phon(F_name,L_name)values('" + textBox1.Text + "','" + textBox2.Text + "')";
OleDbCommand addq = new OleDbCommand(s, con);
con.Open();
addq.ExecuteNonQuery();
con.Close();
// fill grid after insert data
da = new OleDbDataAdapter("select * from phon", con);
dt = new DataTable();
da.Fill(dt);
Gridphon.DataSource = dt;

Fastdesign
یک شنبه 05 آذر 1391, 12:42 عصر
دوست عزیز من این کار رو انجام دادم الان برنامه هیج خطایی هم نمیده !
فقط نمیدونم چرا وقتی تو فرم دوم رکوردی رو اضافه می کنم چرا تو گرید که تو فرم اول قرار داره اضافه نمیشه !

veniz2008
یک شنبه 05 آذر 1391, 13:27 عصر
در فرم2 یه جایی هست که فرم رو میبندید ( this.close )، اونو بردارید و برنامه رو یه بار دیگه تست کنید.
از کدوم روش استفاده کردید؟( یه بار از نو انجام دادید یا همون قبلی رو دستکاری کردید؟)

Fastdesign
یک شنبه 05 آذر 1391, 17:19 عصر
دستور Close رو هم پاک کردم ! حالا وقتی رو دکمه اضافه کلیک می کنم رکورد اضافه میشه ولی اگه از فرم دوم خارج بشم(با دکمه Close فرم) رکوردهای اضافه شده تو گرید نمایش داده نمیشه ! یعنی تا زمانی که تو فرم دوم هستم فقط تو گرید فرم اول رکوردهای اضافه شده نمایش داده میشه !

روش : یک بار از نو این روش رو انجام دادم .

مشکل چیه !

plus
یک شنبه 05 آذر 1391, 17:31 عصر
دسترسی به DataGridView ی مربوط به یک فرم، از یک فرم دیگه کلا کار درستی نیست.شما اگه توضیح میدادی دقیقا چکار میخوای بکنی روش بهتری میشد پیدا کرد که درگیر این مشکلات نشی.

Fastdesign
یک شنبه 05 آذر 1391, 17:46 عصر
خب دوست عزیز حالا من از صفر براتون توضیح میدم :

من دوتا فرم دارم : فرم 1 و فرم 2 . تو فرم اول یک گرید گذاشتم که میخوام از طریق فرم دوم رکورد رو به دیتابیس اضافه کنم و در گرید که در فرم اول قرار داره رکورد اضافه شده به دیتابیس برام نمایش داده بشه !

حالا مشکل من اینه که : با کدهایی که در پست یک قرار دادم می تونم در فرم اول اضافه کنم و فورا رکورد اضافه شده برام تو گرید نمایش داده بشه ولی با این کدها که از فرم دوم رکورد رو اضافه می کنم تو فرم اول داخل گرید نمایش داده نمیشه !

دوستان اگه کسی روش بهینه ا بلده راهنمایی کنه

plus
یک شنبه 05 آذر 1391, 18:08 عصر
توی فرم یک به صورت private اینا رو تعریف کنید:


BindingSource bindingSource = new BindingSource();

توی Load فرم اول، اطلاعات رو لود کنید و نمایش بدین:


OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Database.mdb");
OleDbDataAdapter da = new OleDbDataAdapter("select * from phon", con);
DataTable dt = new DataTable();
da.Fill(dt);
bindingSource.DataSource = dt;
dataGridView1.DataSource = bindingSource;

توی فرم دوم این مشخصه رو اضافه کنید:


public BindingSource BindingSource
{
get;
set;
}

توی دکمه Add در فرم دوم، اول داده رو درج کنید:


OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Database.mdb");
con.Open();
string s = "insert into Phon(F_name,L_name)values('"+textBox1.Text+"','"+t extBox2.Text+"')";
OleDbCommand addq = new OleDbCommand(s,con);
addq.ExecuteNonQuery();

و DataSource مربوط به BindingSource رو آپدیت کنید( ادامه کد قبل):


OleDbDataAdapter da = new OleDbDataAdapter("select * from phon", con);
DataTable dt = new DataTable();
da.Fill(dt);
BindingSource.DataSource = dt;
con.Close()

و توی فرم 1 جایی که قرار فرم 2 نمایش داده بشه:


Form2 form2 = new Form2();
form2.BindingSource = bindingSource;
form2.Show();


البته از اونجایی که شما فرم 2 رو در حالت ShowDialog نمایش نمیدی و میخوای هم زمان با اضافه شدن رکورد در فرم 2، فرم 1 هم آپدیت بشه، این کد بعد از هر بار اضافه کردن رکورد یک Select میزنه تا لیست رو در بیاره که روش چندان جالبی نیست.ولی همین اگر کار کرد بگو میشه بهترش کرد.

Fastdesign
یک شنبه 05 آذر 1391, 20:27 عصر
دوست عزیز ! کلافه شدم ! از هر روشی می رم جواب نمی گیرم ! :افسرده:
من این نمونه کد رو می زارم شما به یک روش و یا هر روشی که بهینه تره کاری کنید که از طریق فرم اول بتونم رکورد اضافه شده در فرم دوم رو در گرید برام نمایش داده بشه !
95584

با تشکر

plus
یک شنبه 05 آذر 1391, 21:23 عصر
دوست عزیز شما این متغیر رو باید 1 بار در خود کلاس فرم باید تعریف میکردین :


BindingSource bindingSource = new BindingSource();

یعنی به این صورت:


public partial class Form1 : Form
{
BindingSource bindingSource = new BindingSource();

ولی اشتباها هم توی "لود فرم" تعریفش کردین هم توی رویداد مربوط به دکمه.اون 2 تا خط رو حذف کنید. من تست کردم دست شد.

Fastdesign
دوشنبه 06 آذر 1391, 07:15 صبح
دوست عزیز تست کردم جواب داد . دست گلت هم درد نکنه .چون از بس تست کرده بودم و جواب نمی گرفتم دیگه کلافه شده بودم خودم هم نمی دونستم چکار می کردم .:تشویق::تشویق::تشویق:

با تشکر
موفق و پیروز باشید

Fastdesign
دوشنبه 06 آذر 1391, 07:56 صبح
دوست عزیز کار متد get و set چیه ؟

مختصر توضیح بدید .

plus
دوشنبه 06 آذر 1391, 18:27 عصر
دوست عزیز کار متد get و set چیه ؟

مختصر توضیح بدید .



public BindingSource BindingSource
{
get;
set;
}

یه Property (مشخصه) از نوع BindingSource تعیین میکنه. Property ها معمولا واسه "دستیابی به فیلد های کلاس به صورت غیر مستقیم" بکار میرن.هر Property میتونه گرفته بشه (get) و یا بهش مقدار داده بشه(set).
البته این روش، یه روش خاص از تعریف Property هست که مقدارش رو خودش نگه میداره.در حالت عادی مقدار باید جای دیگه توی کلاس باشه:


public class SampleClass
{
private string name;
..
..
public string Name
{
get { return name; }
set { name = value; }
}
}