PDA

View Full Version : سوال: بررسی تکراری بودن یا نبودن مقادیر ورودی در یکی از ستون‌های datagridview قبل از ذخیره در database



ostovarit
یک شنبه 20 تیر 1389, 23:39 عصر
با سلام و خسته نباشید

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

لطفا راهنمایی بفرمایید ... تکه کد نمونه نظر پیشنهاد لینک ... هر چیزی که کمک کنه

hossein_ignore
دوشنبه 21 تیر 1389, 01:22 صبح
ببین یه برنامه کوچیک نوشتم که وقتی ID تکراری بدی به GridView اضافه نمیشه

ostovarit
دوشنبه 21 تیر 1389, 11:06 صبح
ببین یه برنامه کوچیک نوشتم که وقتی ID تکراری بدی به GridView اضافه نمیشه

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

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

- چگونه مقادیر یک ستون رو با هم مقایسه کنم که تکراری نباشند؟؟؟

hossein_ignore
دوشنبه 21 تیر 1389, 11:53 صبح
میتونی همین کارو مقع edit کردن GridView انجام بدی! اما اگه می خوای بعد از اتمام edit کل GridView این کارو انجام بدی میتونی هر سطر از سطون رو با همه ی سطرهای دیگه چک کنی.
مثلا سطر 1 با سطر 2و3و4و...
سطر 2 با 1و3و4و...

hossein_ignore
دوشنبه 21 تیر 1389, 12:21 عصر
اینم مثال :

اَرژنگ
دوشنبه 21 تیر 1389, 12:30 عصر
روشهایه اشتباه اول به کاربر اجازه میدن که مقادیر را دلبخواهی وارد کند و بعد بهش اعلام میکنند که مقدار موجود بوده! خودتار را بزارید جایه کاربر ، کی خوشش میاد بعد از اینکه زمانش را صرف وارد کردن مقادیر کرد بهش اطلاع بدند که زمانش را هدر داده؟
استفاده از کمبو باکسها و یا چک باکسها برایه همین مواقع است، اول قابلیت وارد کردن را فقط به اونچیزی که میتونند وارد کنند محدود کنید.

بررسی مقادیر داتاگرید ویو برایه جلوگیری از ورود مقادیر اشتباه روش اشتباه و ابتدایی است.

ostovarit
دوشنبه 21 تیر 1389, 12:38 عصر
روشهایه اشتباه اول به کاربر اجازه میدن که مقادیر را دلبخواهی وارد کند و بعد بهش اعلام میکنند که مقدار موجود بوده! خودتار را بزارید جایه کاربر ، کی خوشش میاد بعد از اینکه زمانش را صرف وارد کردن مقادیر کرد بهش اطلاع بدند که زمانش را هدر داده؟
استفاده از کمبو باکسها و یا چک باکسها برایه همین مواقع است، اول قابلیت وارد کردن را فقط به اونچیزی که میتونند وارد کنند محدود کنید.

بررسی مقادیر داتاگرید ویو برایه جلوگیری از ورود مقادیر اشتباه روش اشتباه و ابتدایی است.

از دوستانی که در بحث شرکت میکنن ممنونم ...

من نمیتونم از کمبو یا چک باکس استفاده کنم ... داده ای ندارم که کاربر از بین اونها بخواد انتخاب کنه ...

من سناریوم رو میگم شما نظرت رو بگو ببین خوبه یا بد :
کاربر میاد نام مثلا کالا رو در گرید ویرایش میکنه ... من میخوام نام جدیدی که در گرید میزنه تکراری نباشه و اون سلول رو هم خالی رها نکنه ... برای این منظور در ایونت CellEndEdit بیام چک کنم که بعد از ویرایش مقدار در سلول های دیگه هست یا نه اگر بود اون سلول که ویرایش شده رو به رنگ قرمز در بیارم ... پس همون لحضه کاربر متوجه شده که مقدار ورود اشتباه هست یا اصلاح میکنه همون موقع یا در اخر اصلاحش میکنه در کل بعد از اینکه تمامی تغییرات رو در گرید انجام داد وقتی میخواد دکمه ذخیره رو بزنه من نگاه میکنم ببینم سلولی به رنگ قرمز باقی مونده یا نه اگر نه که میزارم ذخیره کنه ...نظرتون چیه دوست عزیز؟؟؟

(این نکته رو هم در نظر بگیرید که قرار نیست هر روز کاربر بیاد نام کالا رو ویرایش کنه)

hossein_ignore
دوشنبه 21 تیر 1389, 12:51 عصر
حالا مقع edit هم رنگو عوض میکنه :

اَرژنگ
دوشنبه 21 تیر 1389, 12:52 عصر
از دوستانی که در بحث شرکت میکنن ممنونم ...

من نمیتونم از کمبو یا چک باکس استفاده کنم ... داده ای ندارم که کاربر از بین اونها بخواد انتخاب کنه ...

من سناریوم رو میگم شما نظرت رو بگو ببین خوبه یا بد :
کاربر میاد نام مثلا کالا رو در گرید ویرایش میکنه ... من میخوام نام جدیدی که در گرید میزنه تکراری نباشه و اون سلول رو هم خالی رها نکنه ... برای این منظور در ایونت CellEndEdit بیام چک کنم که بعد از ویرایش مقدار در سلول های دیگه هست یا نه اگر بود اون سلول که ویرایش شده رو به رنگ قرمز در بیارم ... پس همون لحضه کاربر متوجه شده که مقدار ورود اشتباه هست یا اصلاح میکنه همون موقع یا در اخر اصلاحش میکنه در کل بعد از اینکه تمامی تغییرات رو در گرید انجام داد وقتی میخواد دکمه ذخیره رو بزنه من نگاه میکنم ببینم سلولی به رنگ قرمز باقی مونده یا نه اگر نه که میزارم ذخیره کنه ...نظرتون چیه دوست عزیز؟؟؟
۱.نام کالا به تنهایی کافی نیست، مثلاً نام کالا "میز"، رنگها، ابعاد ، آهنی، چوبی ، پلاستیکی ، .. و کلی خصوصیات جداگانه دیگر دارند.
به جایه اینکه به اسم کالا توجه کنید به شماره کالا باید توجه کرد ، و یا اینکه تمام مختصاتی که یک کالا را از یک کالایه دیگر متمایز میکند را باید کلید پایه قرار بدید.
در ضمن با شماره‌هایه کلیدی کار کنید بهتر است تا اینکه اسم کالا ، ماشالاه هنوز "ی" و "ک" دو نوع مختلف استفاده میشند.
یا هم اینکه تمام مختصاتی که یک کالا را از یک کالایه دیگر را متمایز میکنه را به عنوان کد کالا استفاده کنید.
این کالاها از منابع دیگر باید وارد بشند، پس حتماً فروشنده‌شان هم یک کدی براشان استفاده کرده، یا همان کد فروشنده را استفاده کنید یا هم اینکه یکنوع کد داخلی خودتان برایشان ایجاد کنید.

hossein_ignore
دوشنبه 21 تیر 1389, 13:01 عصر
اینارو DL نمیکنی؟! اگه میکنی پس چرا نوشته (0 دیدار) ؟؟؟ اگه DL نمی کنی پس چرا تشکر میکنی؟!

ostovarit
دوشنبه 21 تیر 1389, 13:04 عصر
اینارو DL نمیکنی؟! اگه میکنی پس چرا نوشته (0 دیدار) ؟؟؟ اگه DL نمی کنی پس چرا تشکر میکنی؟!

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

ostovarit
دوشنبه 21 تیر 1389, 13:12 عصر
۱.نام کالا به تنهایی کافی نیست، مثلاً نام کالا "میز"، رنگها، ابعاد ، آهنی، چوبی ، پلاستیکی ، .. و کلی خصوصیات جداگانه دیگر دارند.
به جایه اینکه به اسم کالا توجه کنید به شماره کالا باید توجه کرد ، و یا اینکه تمام مختصاتی که یک کالا را از یک کالایه دیگر متمایز میکند را باید کلید پایه قرار بدید.
در ضمن با شماره‌هایه کلیدی کار کنید بهتر است تا اینکه اسم کالا ، ماشالاه هنوز "ی" و "ک" دو نوع مختلف استفاده میشند.
یا هم اینکه تمام مختصاتی که یک کالا را از یک کالایه دیگر را متمایز میکنه را به عنوان کد کالا استفاده کنید.
این کالاها از منابع دیگر باید وارد بشند، پس حتماً فروشنده‌شان هم یک کدی براشان استفاده کرده، یا همان کد فروشنده را استفاده کنید یا هم اینکه یکنوع کد داخلی خودتان برایشان ایجاد کنید.

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

در مورد خصوصیات دیگه کالا مثل رنگ و ... اونها رو هم ذخیره میکنم و مهم نیست اگر یکی هم باشه ...

اگر راه حلی بهتر برای کنترل ورودی ها به نظرتون میرسه ممنون میشم بگید ...
(مثلا من در جستجو هام دیدم که از ایونت Validate گرید استفاده شده که اصلا نسبت بهش اشنا نیستم و حتس نمیدونم کی اتفاق می افته !!)

با تشکر از همه عزیزان

اَرژنگ
دوشنبه 21 تیر 1389, 13:30 عصر
متوجه شدم نکته ای که گفتید و کاملا هم بجا بود قضیه ک و ی بود که من در نظرم نبود اما در کل با توجه به فرمهای دیگم مثلا صدور فاکتور و غیره به ناچار مجبورم نام کالا رو یکتا بگیرم و با توجه به ورژن هایی که در اینده میخوام بنویسم کد کالا هم باید یکتا باشد در اصل دو تا مورد دارم که باید حتما در تمامی کالا ها با هم متفاوت باشند ...
و یک اصل رو من در نرم افزارم در نظر گرفتم اون هم اینه که کار بر بتونه نود و نه درصد اطلاعات رو ویرایش کنه ...
برای همین به ناچار باید کنترل کنم که کد و نام کالا یکتا باشند و خالی نمونند که روشی که انتخاب کردم بهترین چیزی بود که به ذهنم رسید که به کمک نمونه کدی که دوستمون برام گذاشتن عملی میشه ...

در مورد خصوصیات دیگه کالا مثل رنگ و ... اونها رو هم ذخیره میکنم و مهم نیست اگر یکی هم باشه ...

اگر راه حلی بهتر برای کنترل ورودی ها به نظرتون میرسه ممنون میشم بگید ...
(مثلا من در جستجو هام دیدم که از ایونت Validate گرید استفاده شده که اصلا نسبت بهش اشنا نیستم و حتس نمیدونم کی اتفاق می افته !!)

با تشکر از همه عزیزان

وارد کردن اطلاعات در گرید ویو روش پیش پا افتاده‌ایست که اشکالات بوجود میاره، فقط این روش زمانی بدرد میخوره که مقدار اطلاعات کم باشد.
خودتان را جایه کاربر بزارید، یک فرم بخصوص برایه کمک به وارد کردن اطلاعات بسازید بهتر از این است که یکچیزی با گرید ویو سرهم بشه. البته در برنامه‌هایه درست حسابی از یک فرم مجزا برایه دیدن اطلاعات هر داده مجزا استفاده میشه.
ایونت Validate زمانی صدا زده میشه که فوکوس از یک سل به یک چیزه دیگر منتقل میشه :
http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.cellvalidating.a spx

ostovarit
دوشنبه 21 تیر 1389, 13:38 عصر
وارد کردن اطلاعات در گرید ویو روش پیش پا افتاده‌ایست که اشکالات بوجود میاره، فقط این روش زمانی بدرد میخوره که مقدار اطلاعات کم باشد.
خودتان را جایه کاربر بزارید، یک فرم بخصوص برایه کمک به وارد کردن اطلاعات بسازید بهتر از این است که یکچیزی با گرید ویو سرهم بشه. البته در برنامه‌هایه درست حسابی از یک فرم مجزا برایه دیدن اطلاعات هر داده مجزا استفاده میشه.
ایونت Validate زمانی صدا زده میشه که فوکوس از یک سل به یک چیزه دیگر منتقل میشه :
http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.cellvalidating.a spx

اگر بحث رو دارم ادامه میدم قصد جسارت ندارم صرفا میخوام مطلب برای خودم روشن بشه و روشی رو که میرم اشتباه باشه ...

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

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

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

اینجوری در زمان صرفه جویی میشه با توجه به اینکه ویرایش اطلاعات کار روزمره نیست.

اَرژنگ
دوشنبه 21 تیر 1389, 13:55 عصر
اگر بحث رو دارم ادامه میدم قصد جسارت ندارم صرفا میخوام مطلب برای خودم روشن بشه و روشی رو که میرم اشتباه باشه ...

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

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

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

اینجوری در زمان صرفه جویی میشه با توجه به اینکه ویرایش اطلاعات کار روزمره نیست.

دوست عزیز،
ادامه صحبت هیچ وقت جسارت نیست، اگر موضوعی مبهم هست همیشه باید ته و توهش را درآورد، ما برایه همین زنده‌ایم! :)
ببین این نکاتی که میگم به جاهست و یا نه (لازم نیست هیچ چی را بدانه دلیل قبول کنید):
کنترلها را میشه از چند لحاظ دسته بندی کرد، یکی از جنبه‌ها این است که بعضی کنترلها جون میدن برایه دیدن تعداد زیاد از رکوردها ، داتاگرید ویو هم برایه تماشایه یک رکورد بیشتر حرف ندارد.
ولی زمان ویرایش و یا اضافه کردن یک داده‌ بخصوص بهتر است که کاربر و برنامه بر رویه یک رکورد تمرکز پیدا کنند. با استفاده از یک فرم مجزا، کنترل بیشتری در زمان ویرایش دارید، اگرچه درست بودن تمام نکات را بر رویه فرم نباید کد کرد، ولی بازهم از اینکه در ایونتهایه گرید ویو دست پا زدن بهتر است.
اگر این فروم رو نگاه کنید، میبینید پر است از سوالهایی که با داتاگرید ویو کشتی میگیریند که یک مسائل ساده را پیاده کنند به جایه اینکه به کار برنامه ربط داشته باشد تمام تمرکز میره به اینکه با داتاگرید ویو چجوری دست و پنجه نرم بشه، بعدش هم یک اسپاگتی کد که معلوم نیست چه خبره را سرهم میکنند.
اگر به مثالهایه ویرایشی داتاگرید ویو نگاه بندازید میبینید که از روشهایه درست بویی نبردن ، استفاده از معماری ۳ لایه را اصلاً رعایت نمیکنند و با پیچیدن کد یک جوری سره ته قضیه را هم میارند ، برنامه نویسی با آدامس و چوب کبریت.
حالا سوال اصلی این است که چی مهمه: به اینکه در قوطی داتاگرید یک چیزی را سرهم کرد یا اینکه ورود داده‌ها به راحتی و آشکاری مدیریت بشه (برنامه نویسی ۳ لایه حتماً توصیه میشه).
رنگی کردن گرید ویو برایه کارهایه تماشایی جالبه، ولی مدیریتش سخته و روشهایه راحتر و تمیزتر وجود دارند.

ostovarit
دوشنبه 21 تیر 1389, 14:29 عصر
دوست عزیز،
ادامه صحبت هیچ وقت جسارت نیست، اگر موضوعی مبهم هست همیشه باید ته و توهش را درآورد، ما برایه همین زنده‌ایم! :)
ببین این نکاتی که میگم به جاهست و یا نه (لازم نیست هیچ چی را بدانه دلیل قبول کنید):


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

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

در مورد اینکه روشی که شما میگید ساده تر هست و بیشتر برنامه نویسان به اون تمایل دارند شکی نیست ... ولی من در مورد اینکه این روش یعنی نمایش داده ها در فیلدهای مجزا برای ویرایش نه داخل گیرید صرفا ساده ترین راه هست یا بهترین راه شک دارم؟!

گرید ویو کنترل سر سختیه ... نکته زیاد داره ... باگم داره خودم به دو تاش بر خوردم تو خود فروم ماکروسافت هم بگردید زیاد پیدا میشه ... اما به نظرم اگر خوب باهاش کار کنیم و تمیز کد بزنیم می تونیم ازش خوب بهره ببریم و بهینه تر از پاس کاری اطلاعات به فرم و ...

شاید یک مقدار این قضیه سلیقه ای باشه یا هنوز تجربه کافی در این مورد ندارم ولی چون خودم قبل از اینکه برنامه نویسی کنم با برنامه های زیادی کار کردم از اینکه بخوام کاربرم رو هی به این فرم و اون فرم پاس برم برای انجام کارها بیزارم ...

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

hojjatshariffam
دوشنبه 21 تیر 1389, 16:07 عصر
دوست عزیز من خودم برای ویرایش اطلاعات کلی یک فیلد همیشه از فرم مجزا استفاده می کنم چون که اصولی تر و هم کاربر پسند تر هستش ولی نکته اینجاست که مثلا اگر بخواهیم یک فیلد از چندین رکورد را با هم ویرایش کنیم (و قبلش ه باید روشون پردازش هایی مانند تکراری نبودن رو انجام بدیم دیگه فرم مجزا به درد نمی خوره)
یکم تصورش سخته ، شما شاید فکر کنید که مثلا در یک سیستم چرا باید یک فیلد برای کلی ردیف همزمان ویرایش بشه ، مثلا شاید بگید که کد ملی یا تلفن مشتریان رو که لازم نداریم یکجا تغییر بدیم
باید بگم که تصورات ما اکثرا به همچین مثال هایی می رود ولی من یه مثال می زنم که یکم متفاوته و خودم باهاش درگیر شدم
در یک سیستم کشتارگاه برای هر درج قبض وصول دام یک ردیف در جدول درج میشه ، در پایان روز کل مراجعات لیست میشه و طبق در خواست یک یک مشتریان یا تشخیص مسئول همان بخش باید ترتیب خاصی به این قبوض داده بشه تا با ترتیب تعیین شده کشتار شوند ، برای این کار باید به هر ردیف (به اصطلاح کشتارگاهی) یک پلاک تخصیص داده شود
این پلاک باید در یک فرم برای همه قبوض روز جاری درج شود
من اطلاعات رو به یک گرید دادم و همه فیلد ها رو بجز فیلد پلاک ReadOnly کردم و کاربر فقط در فیلد مربوط به پلاک می تونه پلاک رو به ترتیبی که خودش می خواد وارد کنه ولی نکته اینجاست که این پلاک نباید تکراری باشه (دقیقا شبیه کاری که دوستمون مشکلش در اینجاست)
من برای حل تکراری نبودن این کد رو نوشتم که در ولیدیشن گرید ویو گزاشتم



private void ListGrid_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
foreach (DataGridViewRow Row in ListGrid.Rows)
{
if (ListGrid.SelectedRows.Count > 0)
{
if ((Row.Index == ListGrid.SelectedRows[0].Index) || (Row.Cells["Grid_Pelak"].Value == null)) continue;
if ((Row.Cells["Grid_Pelak"].Value.ToString() == e.FormattedValue.ToString()) && (e.ColumnIndex == ListGrid.Columns["Grid_Pelak"].Index))
{
ListGrid.Rows[e.RowIndex].ErrorText = "شماره پلاک تکراری می باشد";
toolStripStatusLabel1.Text = "شماره پلاک تکراری می باشد";
e.Cancel = true; break;
}
else toolStripStatusLabel1.Text = ".";
}
}
}


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

اَرژنگ
دوشنبه 21 تیر 1389, 17:10 عصر
این حرف رو قبول دارم که کار ساده تر و ظاهرا اصولی تر خواهد بود وقتی اطلاعات در فرم ویرایش بشن اما ترجیه میدن سختی کشتی گرفتن با گرید رو به خودم بدم ولی کاربر به ساده ترین روش ممکن فعالیتی رو که میخواد انجام بده ...
جالب اینجاست که گرید ویو همانطوری که اسمش روشه جدول برایه کلی دیدن اطلاعات است، ولی یک فرم مجزا تمرکز را میبره بر رویه یک رکورد.
منظور از سختی فقط این نبود که برایه برنامه‌نویس سخته و از فرم مجزا برایه تنبلی استفاده بشه، بلکه به جایه مقدار زمانیکه برایه پخش و پلا کردن منطق برنامه و گرده زدن با گرید ویو صرف میشه از روش معماری ۳ لایه استفاده بشه و منطق ویرایش و اضافه کردن یک رکورد به شکل مجزا و دقیق پیاده بشه نه اینکه مانند تمام مثالهایه کد اسپاگتی که منطق برنامه را بر رویه فرم پیاده میکنند.
تا حالا ندیدم برنامه‌ای که با معماری درست نوشته شده باشد از گرید ویو به این شکل (سو)استفاده کند، حالا اگر سلیقه‌ای هم بگیریم نداشتن معماری درست سلیقه هیچ کسی نیست.

mohsensaghafi
سه شنبه 22 تیر 1389, 02:09 صبح
سلام دوست عزیز.
یک راه خیلی راحت اینه که تمام اطلاعاتی رو که می خواید تو جدول درج کنید رو با یه Query از دیتابیس بپرسید. به این صورت


select count(*)
from your_table
where the_new_row_information_that_want_to_add_to_databa se_in_condition_style


از دوستان اگر نظر مشابه دادم پوزش می طلبم چون من تمام نظرات رو نخوندم.

ostovarit
سه شنبه 22 تیر 1389, 10:30 صبح
سلام دوست عزیز.
یک راه خیلی راحت اینه که تمام اطلاعاتی رو که می خواید تو جدول درج کنید رو با یه Query از دیتابیس بپرسید. به این صورت


select count(*)
from your_table
where the_new_row_information_that_want_to_add_to_databa se_in_condition_style
از دوستان اگر نظر مشابه دادم پوزش می طلبم چون من تمام نظرات رو نخوندم.


تو سوال من اطلاعات هستند و نمایش داده میشن و با متد da.update() به روز میشن ... query نوشته نمیشه ... ولی برای زمانی که بخوایم با کوئری اطلاعات رو اضافه کنیم روش خوبی به نظر میاد ....

hojjatshariffam
سه شنبه 22 تیر 1389, 16:11 عصر
جالب اینجاست که گرید ویو همانطوری که اسمش روشه جدول برایه کلی دیدن اطلاعات است، ولی یک فرم مجزا تمرکز را میبره بر رویه یک رکورد.
منظور از سختی فقط این نبود که برایه برنامه‌نویس سخته و از فرم مجزا برایه تنبلی استفاده بشه، بلکه به جایه مقدار زمانیکه برایه پخش و پلا کردن منطق برنامه و گرده زدن با گرید ویو صرف میشه از روش معماری ۳ لایه استفاده بشه و منطق ویرایش و اضافه کردن یک رکورد به شکل مجزا و دقیق پیاده بشه نه اینکه مانند تمام مثالهایه کد اسپاگتی که منطق برنامه را بر رویه فرم پیاده میکنند.
تا حالا ندیدم برنامه‌ای که با معماری درست نوشته شده باشد از گرید ویو به این شکل (سو)استفاده کند، حالا اگر سلیقه‌ای هم بگیریم نداشتن معماری درست سلیقه هیچ کسی نیست.
من همه برنامه هام رو با معماری سه لایه می نویسم ، و هیچ مشکلی هم با گرید ویو نداره (منظورم معماری سه لایه است)
در خوبی معماری سه لایه هیچ شکلی نیست ولی مشکل این دوستمون استفاده از معماری سه لایه نبود ، چون من همون کدی رو که گذاشتم رو در هنگام ذخیره از معماری سه لایه استفاه می کنم
به هر حال امید وارم که مشکل دوستمون حل شده باشه

ostovarit
سه شنبه 22 تیر 1389, 16:14 عصر
با تشکر از راهنمایی همه دوستان
مطالبی که گفتند مفید بود ... خیلی از نکات رو یاد گرفتم
الان مشکلی ندارم و پروژه داره پیش میره اگر باز مشکلی بود مطرح میکنم
بازم ممنون

:لبخندساده:

اَرژنگ
سه شنبه 22 تیر 1389, 18:06 عصر
من همه برنامه هام رو با معماری سه لایه می نویسم ، و هیچ مشکلی هم با گرید ویو نداره (منظورم معماری سه لایه است)
در خوبی معماری سه لایه هیچ شکلی نیست ولی مشکل این دوستمون استفاده از معماری سه لایه نبود ، چون من همون کدی رو که گذاشتم رو در هنگام ذخیره از معماری سه لایه استفاه می کنم
به هر حال امید وارم که مشکل دوستمون حل شده باشه
در معماری ۳ لایه، منطق در لایه GUI (بر رویه فرم) پیاده نمیشه، کدی که گذاشته شده بود منطق را رویه فرم دارد پیاده میکند.

hojjatshariffam
چهارشنبه 23 تیر 1389, 00:19 صبح
در معماری ۳ لایه، منطق در لایه GUI (بر رویه فرم) پیاده نمیشه، کدی که گذاشته شده بود منطق را رویه فرم دارد پیاده میکند.
شما تو لایه دوم چه روشی دارین برای پیاده سازی این کد؟
کد:

private void ListGrid_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
foreach (DataGridViewRow Row in ListGrid.Rows)
{
if (ListGrid.SelectedRows.Count > 0)
{
if ((Row.Index == ListGrid.SelectedRows[0].Index) || (Row.Cells["Grid_Pelak"].Value == null)) continue;
if ((Row.Cells["Grid_Pelak"].Value.ToString() == e.FormattedValue.ToString()) && (e.ColumnIndex == ListGrid.Columns["Grid_Pelak"].Index))
{
ListGrid.Rows[e.RowIndex].ErrorText = "شماره پلاک تکراری می باشد";
toolStripStatusLabel1.Text = "شماره پلاک تکراری می باشد";
e.Cancel = true; break;
}
else toolStripStatusLabel1.Text = ".";
}
}
}


تو معماری سه لایه باید کار هر لایه داخل خودش انجام بشه و نباید کار به هم پاس کاری بشه بلکه داده آماده باید پاس بشه
من که هیچ راهی به ذهنم نمیرسه
هدفم از ادامه بحث رفع ابهاماتیه که برای خودم پیش اومده

ahrimaneahurai
چهارشنبه 23 تیر 1389, 00:29 صبح
دوست عزیز اگه می خوای id رو فقط چک کنی با یه دستور in تو sql چک کن اگه چیزی بر نگردونه که میتونی همه رو ثبت کنه. اما کلا این کار شتباهه.
تو گریدویو نذار کاربر چیزی وارد کنه. اومدیم طرف کلی وارد کرد برق رفت.
بذار تک تک insert کنه

ostovarit
چهارشنبه 23 تیر 1389, 00:32 صبح
دوست عزیز اگه می خوای id رو فقط چک کنی با یه دستور in تو sql چک کن اگه چیزی بر نگردونه که میتونی همه رو ثبت کنه. اما کلا این کار شتباهه.
تو گریدویو نذار کاربر چیزی وارد کنه. اومدیم طرف کلی وارد کرد برق رفت.
بذار تک تک insert کنه

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

اَرژنگ
چهارشنبه 23 تیر 1389, 17:19 عصر
شما تو لایه دوم چه روشی دارین برای پیاده سازی این کد؟


کد:



private void ListGrid_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)



{
foreach (DataGridViewRow Row in ListGrid.Rows)
{
if (ListGrid.SelectedRows.Count > 0)
{
if ((Row.Index == ListGrid.SelectedRows[0].Index) || (Row.Cells["Grid_Pelak"].Value == null)) continue;
if ((Row.Cells["Grid_Pelak"].Value.ToString() == e.FormattedValue.ToString()) && (e.ColumnIndex == ListGrid.Columns["Grid_Pelak"].Index))
{
ListGrid.Rows[e.RowIndex].ErrorText = "شماره پلاک تکراری می باشد";
toolStripStatusLabel1.Text = "شماره پلاک تکراری می باشد";
e.Cancel = true; break;
}
else toolStripStatusLabel1.Text = ".";
}
}
}


تو معماری سه لایه باید کار هر لایه داخل خودش انجام بشه و نباید کار به هم پاس کاری بشه بلکه داده آماده باید پاس بشه
من که هیچ راهی به ذهنم نمیرسه
هدفم از ادامه بحث رفع ابهاماتیه که برای خودم پیش اومده

همیشه پیش فرض ادامه بحث این است که ابهامات رفع بشه، منتها در همین سایت بعضیها که درک فهم یک مسعله را ندارند با گفتن کل کل نکن کمبود فکری خودشان را نشان میدن ، به این نوع اشخاص توجه نکنید. همیشه تا زمانی که ابهام و یا اینکه چیزی به نظر درست نمیاد باید به بحث ادامه داد.
در مورد "تو لایه دوم چه روشی دارین برای پیاده سازی این کد؟" ، باید به این نکات توجه بشد:
۱. کد به خودی خود مفهومی ندارد، کد پیاده کردن منطقی یک مفهوم هست. مثال که زدید نمایشگر یکی از اشتباهای کدنویسهاست (نه برنامه‌نویسها).
کد باید صراحتهاً هدر را اعلام کند، در این مثال باید با مهندسی معکوس به اینکه هدف نداشتن پلاک تکرای نبوده رسید، منتها این هدف منطقی است که میبایست در لایه منطقی پیاده میشد، منتها وقتی که به این کد بهم ریخته نگاه میکنیم کمبود اینکه که با چه شئی منطقی داریم کار میکنیم کاملاً مشخصه، به جایه اینکه یکتا بودن پلاک از لحاظ منطقی پیاده شده باشد، دارد به مقادیر سلهایه داتاگرید ویو کشتی میگره، اصلاً وجود بیزینس ابجکت و بیزینس رولز در مابین این کد پخش شده. روش درست انجام این کار در معماری ۳ لایه به این شکل است:
۱.اولاً اینکه از داتاگرید ویو و یا چه کنترل دیگری برایه نمایش استفاده میشه را کاملاً نادیده میگیریم.
۲.به جایه اینکه به خصوصیتهایه کنترل نمایشی توجه کنیم به اینکه چه چیزی با کنترل نمایش داده میشه توجه میکنیم ، استفاده از BindingSource روش درست است.
۳.BindingSource.Current شئی منطقی واقعی را در اختیار میزاره (البته اگر درست برنامه نویسی شده باشد، وگرنه استفاده از داتاتیبلهایی که همینطوری مقادیر را میریزند توشان هیچ مشکلی را حل نمیکنه).
۴.با استفاده و پیاده کردن اینترفیسهایه مربوط به داتا بایندینگ این منطقها را میشه در لایه منطقی نگه داشت تا اینکه به این شکل بر رویه لایه نمایشی پخش و پلاشان کرد.
به شکل خلاصه جواب میشه استفاده از داتابیندینگ واستفاده از بیزینس ابجکتهاست.

در ضمن نمیدونم اینکه "تو معماری سه لایه باید کار هر لایه داخل خودش انجام بشه و نباید کار به هم پاس کاری بشه بلکه داده آماده باید پاس بشه" را از کجا گرفتید ولی کد مثالی که زدید داره انجام کاری که متعلق به لایه منطقی است را در لایه نمایش پیاده میکنه.
در ضمن درستش این است:"تو معماری سه لایه باید هر کار در لایه‌ای که متخصص به اون نوع کار است انجام بشه و لایه‌ها نباید وظایف همدیگر را دوباره سازی و انجام بدند. هر کاری فقط در لایه مخصوص به اون کار انجام میشه".

hojjatshariffam
چهارشنبه 23 تیر 1389, 23:52 عصر
شماره پلاکی که من ازش حرف زدم تو کل جدول می تونه تکراری باشه ، تو یکی روز نباید تکراری باشه
کل ردیف های دیتا گرید هم ازبیست سی تا بالا تر نمیره در حالی که جدول می تونه تو یک دوره (یا سال مالی) بیش از ده هزار تا ردیف داشته باشه
میشه یه مسال خیلی ساده از معماری سه لایه برامون بزارین تا نکات ابهام رفع بشه
من تقریبا همه برنامه همم با معماری سه لایست ولی الان فکر می کنم که دقیقا نکاتشو رعایت نمی کنم
اگه بتونین یه مثال عملی بزنید ممنون می شیم

اَرژنگ
پنج شنبه 24 تیر 1389, 04:29 صبح
شماره پلاکی که من ازش حرف زدم تو کل جدول می تونه تکراری باشه ، تو یکی روز نباید تکراری باشه
کل ردیف های دیتا گرید هم ازبیست سی تا بالا تر نمیره در حالی که جدول می تونه تو یک دوره (یا سال مالی) بیش از ده هزار تا ردیف داشته باشه
میشه یه مسال خیلی ساده از معماری سه لایه برامون بزارین تا نکات ابهام رفع بشه
من تقریبا همه برنامه همم با معماری سه لایست ولی الان فکر می کنم که دقیقا نکاتشو رعایت نمی کنم
اگه بتونین یه مثال عملی بزنید ممنون می شیم
http://barnamenevis.org/forum/showthread.php?p=952137#post952137

s_mokhtari
چهارشنبه 20 بهمن 1389, 11:33 صبح
دوست عزیز من خودم برای ویرایش اطلاعات کلی یک فیلد همیشه از فرم مجزا استفاده می کنم چون که اصولی تر و هم کاربر پسند تر هستش ولی نکته اینجاست که مثلا اگر بخواهیم یک فیلد از چندین رکورد را با هم ویرایش کنیم (و قبلش ه باید روشون پردازش هایی مانند تکراری نبودن رو انجام بدیم دیگه فرم مجزا به درد نمی خوره)
یکم تصورش سخته ، شما شاید فکر کنید که مثلا در یک سیستم چرا باید یک فیلد برای کلی ردیف همزمان ویرایش بشه ، مثلا شاید بگید که کد ملی یا تلفن مشتریان رو که لازم نداریم یکجا تغییر بدیم
باید بگم که تصورات ما اکثرا به همچین مثال هایی می رود ولی من یه مثال می زنم که یکم متفاوته و خودم باهاش درگیر شدم
در یک سیستم کشتارگاه برای هر درج قبض وصول دام یک ردیف در جدول درج میشه ، در پایان روز کل مراجعات لیست میشه و طبق در خواست یک یک مشتریان یا تشخیص مسئول همان بخش باید ترتیب خاصی به این قبوض داده بشه تا با ترتیب تعیین شده کشتار شوند ، برای این کار باید به هر ردیف (به اصطلاح کشتارگاهی) یک پلاک تخصیص داده شود
این پلاک باید در یک فرم برای همه قبوض روز جاری درج شود
من اطلاعات رو به یک گرید دادم و همه فیلد ها رو بجز فیلد پلاک ReadOnly کردم و کاربر فقط در فیلد مربوط به پلاک می تونه پلاک رو به ترتیبی که خودش می خواد وارد کنه ولی نکته اینجاست که این پلاک نباید تکراری باشه (دقیقا شبیه کاری که دوستمون مشکلش در اینجاست)
من برای حل تکراری نبودن این کد رو نوشتم که در ولیدیشن گرید ویو گزاشتم



private void ListGrid_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
foreach (DataGridViewRow Row in ListGrid.Rows)
{
if (ListGrid.SelectedRows.Count > 0)
{
if ((Row.Index == ListGrid.SelectedRows[0].Index) || (Row.Cells["Grid_Pelak"].Value == null)) continue;
if ((Row.Cells["Grid_Pelak"].Value.ToString() == e.FormattedValue.ToString()) && (e.ColumnIndex == ListGrid.Columns["Grid_Pelak"].Index))
{
ListGrid.Rows[e.RowIndex].ErrorText = "شماره پلاک تکراری می باشد";
toolStripStatusLabel1.Text = "شماره پلاک تکراری می باشد";
e.Cancel = true; break;
}
else toolStripStatusLabel1.Text = ".";
}
}
}

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

با سلام
ميشه اين كد را كاري كرد كه تا كاربر ركورد تكراري وارد كرد اصلان اون ركورد توي گريد حذف بشه
با تشكر