PDA

View Full Version : سوال: شرط گذاشتن برای دیتا گرید ویو



aliramazani
جمعه 06 خرداد 1390, 12:14 عصر
سلام
من یک جدول دارم که شامل فیلدهای زیره

name
family
age
address

که توی یک دیتا گرید توی فرم هم نمایش داده می شه

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

اگر مثلا نام مشابه بود یا فقط نام خانوادگی اشکا نداره ولی اگر یک رکوردی پیدا شد که نام و نام خانوادگی هر دو با اطلاعات وارد شده مطابق داشت پیغام خطا بده

shytonak
جمعه 06 خرداد 1390, 12:54 عصر
خوب باید فیلتر کنی و اگه مقداری پیدا شد رکورد جدید وارد نشه.
خیلی آسونه سعی کنی خودت می تونی انجامش بدی

aliramazani
جمعه 06 خرداد 1390, 13:02 عصر
دستورش را بلد نیستم

B.I.O.H.A.Z.A.R.D
جمعه 06 خرداد 1390, 18:35 عصر
خیلی سادست. یه نمونه کد میذارم توجه کنید:

SqlCommand SCM = new SqlCommand("select * from [TableName] where (Name =N'" + txtName.Text + "') and (Family =N'" + txtFamily.Text + "')", SqlCon);
var check = SCM.ExecuteScalar();
if ( check != null)
messagebox.show("داده تکراری");

parhamt
جمعه 06 خرداد 1390, 20:00 عصر
سلام
اگر ديتا گريد شما dgvAsli باشه ميشه با كد زير از گريد استفاده كرد
dgvKomaki=dgvAsli;
dgv.filter="name = '"+textbox_name.text+"' AND family = '"+textbox_family.text+"';
if(dgv.count)
{
error message;
...
}
dgv.RemoveFilter();

parhamt
جمعه 06 خرداد 1390, 20:03 عصر
معذرت مي خواهم در كد كه نوشتم dgv منظورم همان dgvKomaki هست .
موفق باشيد.

aliramazani
جمعه 06 خرداد 1390, 20:48 عصر
asli و komaki یعنی چی؟

aliramazani
جمعه 06 خرداد 1390, 20:57 عصر
خیلی سادست. یه نمونه کد میذارم توجه کنید:

SqlCommand SCM = new SqlCommand("select * from [TableName] where (Name =N'" + txtName.Text + "') and (Family =N'" + txtFamily.Text + "')", SqlCon);
var check = SCM.ExecuteScalar();
if ( check != null)
messagebox.show("داده تکراری");

من از linq استفاده می کنم. اگه بخوام از این دستور استفاده کنم قبلش باید چه کدهایی را بزارم؟

shytonak
جمعه 06 خرداد 1390, 21:05 عصر
این کد با این کد می تونی چک کنی آیا ستونی هایی هستند که عبارتوش یکی هست یا نه.

OleDbConnection ConString = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Environment.CurrentDirectory + "\\DataBase.accdb");
OleDbConnection Con = ConString;
OleDbCommand Command = Con.CreateCommand();
DataSet ds = new DataSet();
Con.Open();
Command.CommandText = "Select name,persianname,englishname From Table1 Where name like '" + s + "'and persianname like '" + s + "'and englishname like'" + s + "'";
OleDbDataAdapter Adapter = new OleDbDataAdapter(Command);
Adapter.Fill(ds);
if (ds.Tables[0].Rows.Count > 0)
{
MessageBox.Show("تکراری");
}

shytonak
جمعه 06 خرداد 1390, 21:08 عصر
یادم رفت name و persianname , englishname اسن ستون ها هستند.

aliramazani
جمعه 06 خرداد 1390, 21:15 عصر
یادم رفت name و persianname , englishname اسن ستون ها هستند.

دوست عزیز من واقعا هیچی نفهمیدم. اگه میشه با جزییات بیشتر برام بگو

ma.rad
جمعه 06 خرداد 1390, 21:15 عصر
دوست عزیز کد شما مطمئنا خطا میگیره چون احتمال داره من یه اسم مثل alireza داشته باشم وکاربر ali وارد کنه چون مشابه پس میگه تکراریه

aliramazani
جمعه 06 خرداد 1390, 21:15 عصر
این کد با این کد می تونی چک کنی آیا ستونی هایی هستند که عبارتوش یکی هست یا نه.
دیتابیسم sql server هستش نه اکسس

aliramazani
جمعه 06 خرداد 1390, 21:19 عصر
دوست عزیز کد شما مطمئنا خطا میگیره چون احتمال داره من یه اسم مثل alireza داشته باشم وکاربر ali وارد کنه چون مشابه پس میگه تکراریه

من یک کد نوشتم که سطر فعلی گرید ویو را چک می کنه می خوام همه سطرها را چک کنه.

کد من اینه:

row2.Text != dgv4.CurrentRow.Cells["id"].Value.ToString()

ma.rad
جمعه 06 خرداد 1390, 21:20 عصر
دوست عزیز انتخاب نام ونام خانوادگی به عنوان کلید صحیح نیست چون امکان داره دو نفر نام ونام خانوادگی مشابه داشته باشن

ma.rad
جمعه 06 خرداد 1390, 21:23 عصر
for (int i = 0; i < dataGridView1.Rows.Count ; i++)
{

if( row2.Text != dataGridView1 .CurrentRow.Cells[i].Value.ToString())
//دستور درج
else
MessageBox.Show("تکراری");
}

aliramazani
جمعه 06 خرداد 1390, 21:24 عصر
می دونم صحیح نیست. نام و نام خانوادگی مثال بود که کسی گیج پروژه من نشه
ولی کدش را لازم دارم

aliramazani
جمعه 06 خرداد 1390, 21:48 عصر
for (int i = 0; i < dataGridView1.Rows.Count ; i++)
{

if( row2.Text != dataGridView1 .CurrentRow.Cells[i].Value.ToString())
//دستور درج
else
MessageBox.Show("تکراری");
}


من از این دستور به شکل زیر استفاده کردم:

for (int i = 0; i < dgv4.Rows.Count ; i++)
{//for

if (row2.Text != dgv4 .CurrentRow.Cells["id"].Value.ToString())
{

دستورات اجرا شود
}



else
MessageBox.Show("پیغام خطا", "Error");
}//for end

ولی پیغام در صورت درست نبودن شرط به اندازه تعداد رکوردها پشت سر هم پیغام خطا را صادر می کنه

ma.rad
جمعه 06 خرداد 1390, 21:55 عصر
اینطوریش کن

for (int i = 0; i < dgv4.Rows.Count ; i++)
{//for

if (row2.Text = dgv4 .CurrentRow.Cells["id"].Value.ToString())
{

MessageBox.Show("پیغام خطا", "Error");
}



else
دستورات اجرا شود
}//for end

aliramazani
جمعه 06 خرداد 1390, 22:08 عصر
فرقی نمی کنه بازهم همینطوره اگر شرط غلط باشه به اندازه رکوردها پیغام خطا میده و اگر درست باشه به تعداد رکوردها توی جدول ثبت می کنه. مقلا اگه 100 تا رکورد باشه 100 بار دیگر این مقدار را ثبت می کنه!

aliramazani
جمعه 06 خرداد 1390, 22:12 عصر
کد زیر فقط سطر فعلی را چک می کنه. می خوام بدون در نظر گرفتن سطر فعلی همه سطر ها را چک کنه row2.Text = dgv4 .CurrentRow.Cells["id"].Value.ToString()

ma.rad
جمعه 06 خرداد 1390, 22:18 عصر
for (int i = 0; i < dgv4.Rows.Count ; i++)
{//for

if ( dataGridView1["columnName", i].Value.ToString();())
{

دستورات اجرا شود
}




else
{
MessageBox.Show("پیغام خطا", "Error");
break;
}
}//for end



شما بعد از کد نمایش پیام حلقه رو بشکنید

aliramazani
جمعه 06 خرداد 1390, 22:27 عصر
یعنی چطوری؟ میشه بیشتر توضیح بدین یا کدش را بگین؟

ma.rad
جمعه 06 خرداد 1390, 22:29 عصر
کد بالا همه سطر ها رو چک می کنه

aliramazani
جمعه 06 خرداد 1390, 22:43 عصر
نشد!

از این کد استفاده کردم ولی با اینکه مقدار برگشتی از row2.text در دتاگرید موجوده ولی باز هم دستورات را اجرا می کنه!


if ( row2.Text!=dgv4["id", i].Value.ToString())

{


اجرای دستورات
break;
}



else

{

MessageBox.Show("پیغام خطا", "Error");

break;

}

}//for end

aliramazani
جمعه 06 خرداد 1390, 22:57 عصر
روی این دستور for (int i = 0; i < dgv4.Rows.Count ;i++) پیغام خطا میده و به i++ ایراد می گیره

ma.rad
جمعه 06 خرداد 1390, 23:05 عصر
for (int i = 0; i < dgv4.Rows.Count-1 ; i++)
حل شد بگو






تشکر یادت نره

aliramazani
جمعه 06 خرداد 1390, 23:19 عصر
نشد.
به i++ ایراد میگیره و پیغام unrechable code detected را میده!

ma.rad
جمعه 06 خرداد 1390, 23:25 عصر
خط به خط اجرا کن ببین حلقه به تعداد رکورد ها اجرا میشه یا نه-بعدbreak اولی حذف کن ببین مشکل از اونه

parhamt
شنبه 07 خرداد 1390, 12:51 عصر
سلام
ببخشيد من خوب برايتان ننوشتم .منظورم از اصلي همان bindingsource اي است كه به ديتاگريد شما وصل است و كمكي bindingsource اي است كه ما عمل فيلتر كردن را روي آن انجام ميدهيم چون اگر عمل فيلتر كردن را روي
bindingsource اصلي انجام دهيم نمايش موارد داخل گريد به هم مي خورد.اگر count روي bindingsource كمكي شما بعد از فيلتر كردن بزرگتر از صفر بود نشان دهنده تكراري بودن مورد است. باز هم معذرت مي خواهم.

parhamt
شنبه 07 خرداد 1390, 13:02 عصر
bindingsource_Komaki=bindingsource_Asli;
bindingsource_Komaki.filter="name = '"+textbox_name.text+"' AND family = '"+textbox_family.text+"';
if(bindingsource_Komaki.count() > 0)
{
error message;
...
}
bindingsource_Komaki.RemoveFilter();

aliramazani
شنبه 07 خرداد 1390, 14:10 عصر
parhamt عزیز من متاسفانه باز هم نفهمیدم شما یه بار کامل واسه من نگفتی چکار کنم و حقیقتش من یکم گیج شدم.

ma.rad عزیز کدهایی که شما دادین سینتکس ارور نداره ولی درست جواب نمیده

من توسط linq یک کد پیدا کردم که پسورد را چک می کنه. این را هم استفاده کردم ولی متاسفانه پسورد چه در دیتابیس موجود باشه چه نباشه دسورات را اجرا می کنه و پیغام خطا نمیده!

من برای چک کردن پسورد از کد زیر استفاده کردم ولی پسورد چه موجود باشه چه نباشه دستورات را اجرا می کنه و پیغام خطا صادر نمیشه

if (db.tests.Where(c => c.test_mthod == (textBox6.Text)).Count() == 0)

parhamt
شنبه 07 خرداد 1390, 15:48 عصر
سلام
شما توسط يك bindingsource كه من در اينجا اسمش را bindingsource_Asli گذاشتم به grid وصل هستيد.اگر از تابع filter آن استفاده كنيد مي توانيد با ساخت يك string مانند قسمت where يك select از آن استفاده كنيد. در مثال من فرض كرده ام شما از 2 تا textbox نام و نام خانوادگي را دريافت ميكنيد و توسط آنها و فيلدهاي شما در database عبارت filter را ساخته ام حال براي اينكه bindingsource اصلي كه به grid وصل هست تغيير نكند bindingsource_komaki را گرفته ام كه روي آن فيلتر را اعمال كنم . همانطور كه گفته ام اگر count() مربوط به bindingsource_komaki بعد از فيلتر كردن بيشتر از 0 بود نشانه آنست كه الان در grid اين نام و نام خانوادگي وجود دارد.كد مثال را كه امروز فرستادم دوباره بررسي كنيد.
موفق باشيد.

aliramazani
شنبه 14 خرداد 1390, 13:21 عصر
اگه نخوام از دیناگرید چک کنه و مستقیما از دیتابیس چک کنه چکار باید بکنیم؟