مشاهده نسخه کامل
: اشاره کمبو باکس و دیتاگرید به رکورد تازه درج شده
قله بلند
13-12-2008, 02:06
با سلام
فرض کنید که درون کمبو باکسی TerritoryID ها قرار دارند.
و جدولی که قرار است درون آن عمل درج انجام شود ، EmploeeTerittoris از پایگاه داده Northwind است. همانطور که می دانید این جدول بر اساس اعداد ، به صورت صعودی مرتب است.
حالا کاربر به واسطه دکمه درجی که روی فرم قرار دارد تراکنشی انجام می دهد. مثلاً رکوردی جدید را درج می کند. بعد از عمل درج ، رکورد جدید به DataGrid افزوده می شود.
تا اینجا مشکلی وجود ندارد.
و اما سوال: بعد از عمل درج، رکورد جدید به انتهای جدول افزوده می شود و سپس جدول دوباره مرتب می شود. حالا من می خواهم به کاربر، موقعیت رکورد درج شده اش را نشان دهم. می خواهم در کمبو باکس همان TerritoryID ایی نشان داده شود که تازه درج شده است و نشانگر نیز در مقابل سطر تازه درج شده در DataGrid ، بایستد.
ولی متاسفانه، نشانگر به ابتدای DataGrid و کمبو باکس منتقل می شود و من نمی توانم سطر تازه درج شده را نشان دهم. همین امر برای داده های درون کمبو هم اتفاق می افتد.
قله بلند
13-12-2008, 18:14
با سلام. سوالم نامفهوم بود؟ برای همین خاطر از دوستان کسی نمی تواند راهنمای ام کند؟
Arshia001
13-12-2008, 19:04
راستش آره،تا حدی...ولی میدونم میتونی با ComboBox.SelectedIndex و ComboBox.SelectedItem آیتم کمبو باکس و با DataGridView.SelectedCell و DataGridView.SelectedRow آیتم دیتا گرید رو تنظیم کنی.میتونی اول ببینی چی اضافه شده بعد بگردی ایندکسشو پیدا کنی و انتخابش کنی یا از همون اول با SelectedItem و خود آیتم اضافه شده که میدونی چیه انتخابش کنی.
قله بلند
13-12-2008, 20:08
با سلام. من اون قسمت هایی که برای کمبو باکس هست رو امتحان می کنم ولی من از DataGrid استفاده می کنم.
سلام
ولی متاسفانه، نشانگر به ابتدای DataGrid و کمبو باکس منتقل می شود و من نمی توانم سطر تازه درج شده را نشان دهم. همین امر برای داده های درون کمبو هم اتفاق می افتد.
اگر از کنترلر DataGridView استفاده میکنید و اگر بتوانید ردیف سطر مورد نظر را پیدا کنید گمانم با خصیصه currentcell مشکلتان حل شود.
مثلاً
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
(البته تست نکردم ولی گمانم جواب دهد)
قله بلند
15-12-2008, 00:18
سلام
من به جواب رسیدم ولی به صورت ساده. چون کدهای مخصوص این کار رو نداشتم ولی هنوز هم اگر چنین کدی پیدا بشه، استقبال می کنم.
راستش برنامه ام کمی پیچیده است و می ترسم که اگر وارد جزئیاتش بشم، خواننده ای مثل خودم علاوه برا اینکه لذتی از خوندنش نبره دلسرد هم بشه
برای این که این سوال بالاخره یک پاسخ منجر به حل مساله رو در خودش داشته باشه، بر خودم واجب دونستم که حتماً به راه حل خودم اشاره ای بکنم.
و اما چگونه به جواب رسیدم.
من دو تا سوال رو مطرح کرده بودم.
اول اینکه: چگونه داده درون کمبو باکس وقتی درجی اتفاق می افته، درست به گزینه ای اشاره بکنه که تازه درج شده.
جواب: چون داده درون کمبو باکس از نوع کاراکتری است(کمبو باکس مثال من) ، پس من به طریقی(که گفتنش خودش می شه یه بحث جدید) رشته ای را به دست می آورم تا بتوانم آن را بهانه ای کنم و به کمبو باکس بفهمانم که دقیقاً به رشته همنام این رشته اشاره کن. می دونم که بدتر گیج شدید. ای کاش می شد کاربران هم می تونستند یک نمونه قرار بدن.
mycombobox.text=mystring
سوال دوم: چه جوری به دیتاگرید بفهمونم که همانجایی رو نشون بده که کمبو هم داره نشون می ده. یعنی کاربر بفهمه که چه چیزی رو درج کرده. یعنی کاربر حق نداره بدونه چه سطری بالاخره درج شده؟!
جواب: من از روش حلقه for استفاده کردم. روشی ساده. اول تعداد سطرهای دیتاگریدم رو شمردم ، بعد حلقه رو تشکیل دادم و گفتم که اگر سلول اول از سطر اول با داده رشته ای من برابر بود، از حلقه بیا بیرون و مقداری رو که حلقه شمرده رو بگذار به عنوان سطری که در دیتاگرید جدیداً اضافه شده، اگر هم برابری حاصل نشد که دوباره حلقه می چرخه. حالا حتی اگر این رکورد تاره درج شده ، وسط های سطرهای دیتاگرید باشه، باز هم نمی تونه از دید کاربر فرار کنه!
shalineh
15-12-2008, 15:01
سوال دوم: چه جوری به دیتاگرید بفهمونم که همانجایی رو نشون بده که کمبو هم داره نشون می ده. یعنی کاربر بفهمه که چه چیزی رو درج کرده. یعنی کاربر حق نداره بدونه چه سطری بالاخره درج شده؟!
جواب: من از روش حلقه for استفاده کردم. روشی ساده. اول تعداد سطرهای دیتاگریدم رو شمردم ، بعد حلقه رو تشکیل دادم و گفتم که اگر سلول اول از سطر اول با داده رشته ای من برابر بود، از حلقه بیا بیرون و مقداری رو که حلقه شمرده رو بگذار به عنوان سطری که در دیتاگرید جدیداً اضافه شده، اگر هم برابری حاصل نشد که دوباره حلقه می چرخه. حالا حتی اگر این رکورد تاره درج شده ، وسط های سطرهای دیتاگرید باشه، باز هم نمی تونه از دید کاربر فرار کنه!
این روش اصلا مناسب نیست. در حجم بالای اطلاعات و داده ها، حلقه شما وقت کاربر و منابع سیستم رو به هدر خواهد داد.
برای یافتن آخرین رکورد وارد شده، ابتدا باید رکورد شما دارای فیلد منحصر به فرد باشد.( بهتر است این فیلد از نوع عددی باشد مثلا Id مربوط به همون رکورد)
سپس با دستور OleDbCommand.ExecuteScalar می توان آخرین آی دی وارد شده رو بدست آورد. و در نهایت با استفاده از همون روشی که کاربر H2 گفتند نشانگر را به ردیف مورد نظرمان هدایت کنیم.
قله بلند
15-12-2008, 19:42
سلام
ممنونم از اینکه توجه کردید
من از DataGrid استفاده می کنم نه Datagridview
همه کارهایی رو هم که شما فرمودید انجام داده ام. تنها نکته ای که برام جالبه، اشاره به سطر تازه درج شده در dataGrid است که به قول شما با حلقه for انجام نشه
قله بلند
23-12-2008, 23:44
با سلام
برای پیدا کردن راه حل یک سوال را مطرح می کنم.
آیا زمانیکه ویرایشی یا حذفی و یا درجی در بانک اطلاعات اتفاق می افتد، رخدادی صدا زده می شود؟
مثلاً با کلیک روی سطر یا سلولی از دیتاگرید و با نوشتن کدهای لازم می توانیم به داده درون یک سلول دسترسی پیدا کنیم.
شاید با دانستن این مطلب که چه زمانی چه رویدادی اتفاق می افتد بتوان بر مشکل فائق آمد
قله بلند
25-12-2008, 13:34
با سلام
دستور زیر اخرین سطر از DataGrid را تولید می کند .
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
آیا می توان این دستور را دستکاری کرد تا شماره سطری خاص به صورت تصادفی را تولید کند؟
سلام
سوالات شما کمی گنگ است.
برای همین هم سعی کردم چندان دخالت نکنم تا دوستان دیگر که بهتر متوجه میشوند جواب دهند.
ولی شاید دوستان دیگر هم همین مشکل من را داشته باشند!
=====
اول اینکه: چگونه داده درون کمبو باکس وقتی درجی اتفاق می افته، درست به گزینه ای اشاره بکنه که تازه درج شده
آیا گزینه تازه درج شده شما، اخرین گزینه نیست؟ چه معیاری برای تشخیص آخرین درج دارید؟ primarykey جدولتان چیست؟ primarykey در زمان درج مشخص است یا حالت autonumber ای دارد؟
سوال دوم: چه جوری به دیتاگرید بفهمونم که همانجایی رو نشون بده که کمبو هم داره نشون می ده
گراید شما سطری را نمایش میدهد، در حالی که یک combo معمولاً یک آیتم خاص را نمایش میدهد.
یعنی شما یک گراید کامل دارید که کل جدول را نمایش میدهد و یک combo که فقط یک فیلد جدول را نمایش میدهد!!!؟
من از DataGrid استفاده می کنم نه Datagridview
این بسیار غیر محتمل است!
کنترلر DataGrid از Framework1 وجود داشت و در Framework2 برای سازگاری حفظ شد ولی مخفی شد و در عوض پیشنهاد شد از کنترلر DataGridView جدید استفاده شود.
پروژه شما یا باید upgrade شده از 2003 باشد یا دستی DataGrid را دستی Toolbox اضافه کرده باشید.
در هر صورت عموماً DataGridView ساده تر و معمول تر است و بهتر است شما هم به سادگی از کنترلر جدیدتر استفاده کنید.
آیا زمانیکه ویرایشی یا حذفی و یا درجی در بانک اطلاعات اتفاق می افتد، رخدادی صدا زده می شود؟
هر دو کنترلر فوق الذکر رویدادهایی دارند، مثل CellEndEdit و CellClick و CurrentCellChanged و رویدادهای DataGridView بسیار بسیار بیشتر و کاملتر است ولی نمیدانم برای به چه دردتان خواهد خورد و میخواهید چه کنید!
آیا می توان این دستور را دستکاری کرد تا شماره سطری خاص به صورت تصادفی را تولید کند؟
اصلاً متوجه نشدم!
میخواهید یک سطر را شانسی انتخاب کنید؟؟
=====
موفق باشید.
قله بلند
27-12-2008, 15:49
با سلام
یکی از مشکلات این سایت این است که کاربران نمی توانند فایل های خود را در برنامه ضمیمه کنند و این مطلب مشکلات زیادی را پدید می آورد. نمی دانم دلیل مدیران محترم برای این کار چیست؟
اگر می شد این کار را کرد، آن وقت هم من راحت تر سوال ام را مطرح می کردم و هم برای شما نحوه طرح سوال گنگ و نامفهوم نبود.
یک بار دیگر سوالم را مطرح می کنم:
1- من جدولی دارم با دو ستون که هر دو ستون آن کلید خارجی است و رویهم می شوند یک کلید اصلی برای جدول. این جدول طرح خودم نیست و از جدول های خود SQL2000 استفاده می کنم.
2- من از وب سرویس برای درج در این جدول استفاده می کنم. البته برای جواب سوال من شاید نکته مهمی نباشد ولی توضیح دادم.
3- من از dataset برای پر کردن سطرهای این جدول استفاده می کنم و آن را از سمت سرور برای مشتری می فرستم. شاید اینهم چندان مهم نباشد.
4- حالا می رویم سمت مشتری. من در سمت مشتری از DataGrid برای نمایش این سطرها استفاده می کنم. نمی دانم چرا از DataGrid استفاده کردم ولی تمام پیکر کارم بر اساس این شیء و رویداد های آن بنا شده است و چون وقت ندارم نمی توانم از شیء دیتا گرید ویو استفاده کنم. ای کاش این موضع را زودتر می فهمیدم.
5- روی فرم برنامه من یک کلید برای درج و تک باکس هایی برای ورود اطلاعات است. اینهم چندان مهم نیست.
6 -سطرهای جدول مورد نظر بر اساس یکی از فیلدها که کلید اصلی جدول دیگر است و در این جدول به عنوان کلید خارجی است به صعودی مرتب است. یعنی وقتی درجی انجام می شود ، سطر تازه درج شده هم از ترتیب تبعیت می کند. مثلاً می رود در بین سطرهای دیگر جای می گیرد.
6- وقتی بر اثر فشردن دکمه درج ، وب سرویس مورد نظر فراخوانی می شود، سطرهای درون dataset تازه می شوند و این بار رکورد تازه درج شده روی datagrid ظاهر می شود. در وب سرویس ، بعد از عمل درج دوباره dataset پُر می شود.
7- من با دو حلقه عمل مقایسه را بین دو داده وارد شده توسط کاربر و داده های دو ستون DataGrid را انجام می دهم و می توانم به سطری که تازه درج شده برسم و اشاره گر DataGrid را روی آن سطر منقل کنم. ولی مسلماً این کار ، کارایی ندارد. می خواهم بدانم آیا راهی وجود دارد که به صورت مستقیم بروم روی همان سطر تازه درج شده یا تنها راه آن استفاده از حقه هاست.
انشاء الله که درست مساله را مطرح کرده باشم.
قله بلند
28-12-2008, 15:26
جناب -h2- عزیر
ضمن عرض سلام و تشکر از شما، خواهشی داشتم
من فقط تا ساعت 12 شب روز چهارشنبه(همین هفته) می توانم از خط تلفن برای ارتباط با اینترنت استفاده کنم. به همین خاطر خواهش می کنم هر انچه من باید در این رابطه بدانم را برایم آموزش دهید.
به قول ابوریحان بیرونی که می گفتند: اگر بدانم و بمیرم بهتر است یا ندانم و بمیرم؟
همین قضیه شرح حال من هم شده ولی با کمی تغییر
قله بلند
28-12-2008, 17:07
راستی یادم رفت بگم که:
من اجازه Sort را در دیتا گرید از کاربر سلب کرده ام
تمام سطرهای جدول را به کاربر نشان می دهم
کاربر می تواند روی ستون ها و سطرهای دیتا گرید کلیک کند و به دنبال داده ای بگردد. هر جا کلیک کند بالافاصله محتویات آن سطر برایش نشان داده می شود.
دیتا گرید شامل قسمتی از سطرهای جدول مورد نظر نیست . شامل همه سطرهای جدول مورد نظر است.
قله بلند
28-12-2008, 23:14
باز هم سلام
ببخشید که مطالب را تیکه تیکه یادم می یاد.
جناب -h2- عزیر، هر سوالی که به ذهنتان می رسد را مطرح نمایید تا به آنها پاسخ دهم.
دیگر مطلبی به ذهنم نمی رسد تا در این پست قرار دهم.
با تشکر
سلام
یکی از مشکلات این سایت این است که کاربران نمی توانند فایل های خود را در برنامه ضمیمه کنند و این مطلب مشکلات زیادی را پدید می آورد. نمی دانم دلیل مدیران محترم برای این کار چیست؟
دلیلش مشخص است! به علت مصرف فضای سرور.
مخصوصاً که MySQL در ضمینه مدیریت پیشرفته دیتاهای binary هم مشکلاتی دارد.
شما میتوانید فایلهای خود را در بیشمار سایتهای آپلود رایگان آپلود کنید و اینجا لینک دهید.
اگر میخواهید من یک برنامه بسیار ساده و آزمایشی برایتان درست میکنم که دیتایی را Insert کند و در هر شرایط به گراید اضافه شده و select شود، با هر sort ای در گراید و هر مجموعه سطرهای و بدون for کار کند.
فقط من باید کاری را سه شنبه تحویل دهم و کار بسیار بسیار عقب است، نتیجتاً فوقش چهارشنبه میتوان مثال را برایتان حاضر کنم و بحث را ادامه دهیم. (علت تاخیر جواب هم همین است.)
حتماً سعی میکنم پروژه نمونه برایتان 4شنبه آپلود کنم.
میبخشید و موفق باشید.
قله بلند
30-12-2008, 00:38
سلام
فقط اگر لطف کنید و قبل از ساعت 12 شب آدرس این برنامه رو بدید تابتونم دانلود کنم ممنون می شم.
با تشکر
سلام
متاسفانه پروژه تحویلی خودم تمام نشد و مجبور شدم چند روزی تحویل را عقب بیاندازم.
ولی نمونه کدی برای شما حاضر کردم.
نمونه کد با #C است و از DataGrid قدیمی استفاده میکندف کلید جدول هم دو فیلد String مشترک هستند.
برای سادگی و اجرا در همه سیستمها از بانک access استفادهکردم ولی این مطلب مطلقاً تفاوتی در کد ایجاد نمیکند.
پروزه یک TypedDataSet به همراه یک TypedDataAdapter دارد که میشد معمولی هم باشند ولی احتمال دادم اینطوری مستند و شفاف تر خواهد بود.
از هر دو کامپونت فوق روی Form برنامه قرار داده ام و یک کامپونت BindingSource هم گذاشته ام
(البته احتمالاً DataView بازدهی بیشتری دارد ولی چون در ToolBox2008 به صورت پیشفرض وجود ندارد، گفتم استفاده از BindingSource ساده تر خواهد بود.)
در واقع وقتی DataSource گراید شما مستقیماً یک DataSet باشد، گراید مجبور میشود به طورداخلی از یک DataView برای ترتیب نمایش استفاده کند و عملاً ایندکس سطر در گراید با ایندکس آن در DataSet هیچ رابطه ای نخواهد داشت.
ولی اگر از یک BindingSource استفاده شود و ان به DataSet وصل شود و گراید به BindingSource این مشکل حل میشود و ایندکس سطرهای گراید همواره با ایندکس BindingSource برابر خواهد بود، نتیجتاً یافتن آیتم در BindingSource یافتن آن در گراید خواهد بود.
با این روش ساده ایندکس در خود محل به سادگی چند خط پیدا شده و استفاده میشود و گراید میتواند به راحتی با سرستونها Sort شود و یا شامل همه اطلاعات دیتابیس نباشد، یعنی اطلاعات در گراید درج شود و سپس به دیتابیس اصلی اضافه شود، بی آنکه نیاز باشد کل دیتابیس در گراید بارگذاری شود.
(در هر شرایطی مشکلی پیش نیاید.)
کد باید قدرتمند، روان و ساده باشد.
h02.ir/Download.aspx?File=DataGridOrdinal.zip
... ساعت 12 شب روز چهارشنبه ...گمانم 23 ساعت و نیم وقت داشته باشید!
موفق باشید.
سلام
راستی یک سوال مهم!
من الآن کمی وقت کردم و پست 12 تان را خواندم!!!!!!
یک کم مشکوک بید!
پست 10 شما حاوی یک کد صددرصد دسکتاپی و غیر وبی است (و پست 9) که من گمان میکنم برنامه شما ویندوزی است ولی:
SQL2000 = سرورهای زمان هخامنشیان!
وب سرویس = استفاده بیشتر در برنامه های وبی.
DataGrid = یک کنترلر قدیمی ویندوزی و یک کنترلر روز ASP.Net !
تحت ASP.Net و وب که کدنویسی نمیکنید؟ (انشا ا...) یعنی برنامه تان ویندوزی-دسکتاپی است؟ (انشا ا...)
(چون کد مثال من که برایتان آپلود کردم ویندوزی-دسکتاپی است.)
قله بلند
31-12-2008, 14:04
با سلام
اولاً من فقط توانستم کدهای درون فرم را باز کنم و ببینم. بقیه باز نمی شود. در ضمن فایل exe هم باز شد. در Ram عمل درج انجام می شد. این امر طبیعی است چون ارتباطی با جدولی وجود نداشت. هر گاه عمل درجی انجام می شود، اشاره گر می رود آخرین سطر را نشان می دهد. وقتی ستونی از DataGrid را Sort می کنم ، داده درج شده نیز از این مرتب سازی تبعیت می کند ولی باز هم اشاره گر می رود روی سطر آخر می ایستد. یعنی تا اینجا به هدف نرسیدم.
در خطوطی که بلوکه شده اند ، قسمت هایی با خط زیر مشخص شده اند. این عناصر در VS2005 برای این شیء وجود ندارند.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
منظورم BindingSource و MainTableRow است.
چگونه معادل کلاس ها و اشیایی که در VS2008 وجود دارند و در VS2005 وجود ندارند را پیدا کنم؟
چون خود فرم باز نمی شود من نمی توانم بفهمم که شما از چه اشیائئ و با چه نامی استفاده کرده اید
سلام
در Ram عمل درج انجام می شد. این امر طبیعی است چون ارتباطی با جدولی وجود نداشت. هر گاه عمل درجی انجام می شود،
برای ذخیره و بارگذاری از دیتابیس از فرامین منویی برنامه استفاده کنید که در منوی File برنامه گزینه Save و Load تعبیه شده که امکان ارتباط با دیتابیس را فراهم میکند.
وقتی ستونی از DataGrid را Sort می کنم ، داده درج شده نیز از این مرتب سازی تبعیت می کند ولی باز هم اشاره گر می رود روی سطر آخر می ایستد. یعنی تا اینجا به هدف نرسیدم.
من مشکلی ندیدم یعنی سطرجاری همواره همان خواهد بود که تازه درج شده، بهرحال این نمونه جدید تر را که هماهنگ تر با 2005 است را استفاده کنید.
منظورم BindingSource و MainTableRow است.
MainTable یک جدول Typed دست ساز در MainDataSet است.
یعنی Project->AddNewItem->DataSet
یعنی به نوعی MainTable معادل System.Data.DataTable است و
MainTableRow معادل System.Data.DataRow است.
متاسفانه من از 2008 استفاده میکنم، پروژه را کمی تغییر دادم و حتی سعی کردم فایل csproj را دستی در notepad ویرایش کنم تا حد امکان در 2005 باز شود ولی همچنان به احتمال زیاد یا باز نمیشود یا با مشکلات بسیاری باز میشود.
اگر همچنان در 2005 باز نشد (که محتمل است.)
شما باید NewProject بزنید و با فرمان Project->AddExistingItem فایلهای زیر را به پروژه اضافه کنید:
frmMainXXXXX
MainDataSetXXXXX
rapidshare.com/files/178529355/DataGridOrdinal.zip
سلام
چون طبق گفته شما چندان فرصتی ندارید و شاید وقت کافی برای رفع مشکل شما در دسترس نباشد، سعی میکنم باز توضیحات تکمیلی دهم تا اگر آنلاین شدید بدون در نظر گیری هر دو سورس شاید کمکتان کند.
اصلاً از اینها که بگذریم...
اصول کار ساده است
شما DataSet را روی فرم قرار دهید و یک DataView هم از ToolBox روی فرم قرار دهید.
خصیصه Table از dataView را به جدول مورد نظر تنظیم کنید و
خصیصه DataSource از DataGrid را به DataView ست کنید.
سپس در زمان Insert سطر را به DataView اضافه کنید
با کدی شبیه این برای غیر TypedDataSet ها (کد Typed در سورس برنامه موجود است)
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
سپس با فرمان شبیه این ایندکس سطر را به دست آورید.
البته در ذات دستور زیر هم نوعی for پیشرفته و با کلاس است!
ولی از for شما بازدهی بیشتری دارد، چون فقط اشاره گرها جستجو میشود، یک چیزی شبیه جستجوی یک عدد int با 32 بیتی .
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در نهایت برای اعمال سطر انتخابی به گراید و select دن فرمان زیر را اجرا میکنید.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
موفق باشید.
قله بلند
31-12-2008, 23:56
سلام
چون طبق گفته شما چندان فرصتی ندارید و شاید وقت کافی برای رفع مشکل شما در دسترس نباشد، سعی میکنم باز توضیحات تکمیلی دهم تا اگر آنلاین شدید بدون در نظر گیری هر دو سورس شاید کمکتان کند.
موفق باشید.
سلام
ممنونم از اینکه کمک می کنید و براتون حل مساله مهمه
من که نمی تونم دیگه سوالی مطرح کنم. شاید بتونم وارد سایت بشم! این رو نمی دونم. حالا اگر دوباره سوالی داشتم چه جوری مطرح کنم؟ من منظور شما رو از این دو جمله نفهمیدم.
قله بلند
01-01-2009, 00:03
سلام
rapidshare.com/files/178529355/datagridordinal.zip
سلام
متاسفانه لینکی برای دانلود فایل وجود نداره. نام فایل و سایز فایل هست ولی لینکی برای دانلود نیست
سلام
من منظور شما رو از این دو جمله نفهمیدم
منظورم ان بود که چون تا ساعت 12 فرصت دارید، هر چه به ذهنم میرسد را بگویم تا شاید دیگر نیازی به پرسیدن سوال نباشد و به جواب مطلوب برسید.
متاسفانه لینکی برای دانلود فایل وجود نداره. نام فایل و سایز فایل هست ولی لینکی برای دانلود نیست
برایم عجیب است که تا حالا از راپید چیزی دانلود نکرده اید، جزء سرورهای بسیار معروف اپلود و دانلود است.
شما هم به راحتی میتوانید فایلهایتان را در این سایت آپلود کنید تا حلال مشکل فقدان امکان attach در این سایت باشد.
برای دانلود کافی است دکمه FreeUser را کلیک کنید و سپس دانلود را مشاهده خواهید کرد.
قله بلند
01-01-2009, 02:59
سلام
من از این سایت هم دانلود کردم و هم در آن فابل آپلود کردم.
نمی دونم چرا چشم من دکمه به این بزرگی رو ندید؟!! خوب خطای دیده دیگه!
امیدوارم جواب ارسال بشه
قله بلند
01-01-2009, 05:37
با سلام
نشد که نشد که نشد
نشانگر می ره به سطر آخر و اصلاً اثری از sort ذاتی جدول نیست.
وقتی من فرم رو می بندم و دوباره لود می کنم ، سطر تازه درج شده دقیقاً از خاصیت جدول پیروی می کنه ولی بدون حضور نشانگر
جناب -H2- یک خواهشی دارم
چون برناه باز نمی شه و من فقط کدهای درون فرم را می بینم، لطف کنید و قطعات برنامه رو توضیح بدید که چه کار می کنن.
مثلاً اشیائی که استفاده می کنید دارن چه کار می کنن؟ یا اینکه در کدام حالت ارتباط با پایگاه قطع شده و دوباره این ارتباط برقرار می شود؟
من معنای کاربردی این اشیاء رو نمی فهمم.
خدایش گیج گیج گیج ام.
الان نیم ساعتی از 5 صبح گذشته و دور از چشم مخابرات این پست رو فرستادم. خدا رو شکر. خدا کنه تا روز جمعه بتونم با سایت ارتباط داشته باشم. البته به مدد بی خیالی مخابرات!!!
قله بلند
01-01-2009, 07:00
باز هم سلام
حالا که خدا با من یاره، اجازه بدید لینکی رو معرفی کنم که رسماً معلوم نیست چی به چیه؟ ولی فکر کنم ایده جالبی داشته باشه
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
سلام
سعی میکنم توضیحاتی آماده کنم ولی نمیدانم کاملتر از پست 22 شود یا نه!
اگر میتوانید خود شما پروژه ساده ای از 2005 (مشابه همان که من آپلود کردم را) آپلود کنید من آنرا طوری ورایش میکنم که حتماً در 2005 باز شود.
(چه با Notepad و چه با VS2008 ولی در 2005 باز خواهد شد.)
لینک codeproject شما مربوط به تشخیص سطرجاری ایت و گمان نکنم ربطی به ست کردن سطر جاری داشته باشد.
برنامه ای که من اپلود کردم exe کامپایل شده اش هم در bin\Release موجود است.
لطفاً حداقل همان exe خود من را اجرا کنید و ببینید کار میکند و کاری که میخواهید را انجام میدهد یا نه؟
(توجه کنید که کد save و load در برنامه من خودکار نیست که مثلاً با خروج save انجام شود. باید پس از اجرای exe از منوهای آن دستی فرمان صریح load و save را بدهید.)
قله بلند
01-01-2009, 15:50
با سلام
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
آیا روشی که من برای Update استفاده کردم درست است؟
آیا برای درج رکورد جدید نیازی به دستورات زیر وجود دارد؟
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
یا اینکه اضافه کردن سطر جدید به dataview همه کارها رو انجام می ده؟
من از هر دو روش استفاده کردم. روش اولی که واقعاً رکوردی را درج می کند ولی نمی توانم نشانگر را روی رکورد تازه درج شده بیاورم.
در روش دوم هم واقعاً رکوردی درج نمی شود.
در برنامه شما به روز رسانی و سطر درج شده در dataview چه جور اتفاق می افته؟
اصولاً نمی فهمم که اتصال connection و dataset و datatable و dataview و datarowview در هر زمان چه حالتی است. کی اتصال به پایگاه بر قرار می شود و کی در حال به روز رسانی است و کی درون پایگاه تغییرات اعمال می شود؟
چون من تا به حال با شیء های datatable و dataview و datarowview کار نکرده ام.
خدا رو شکر که تونستم دوباره سوال بپرسم.
سلام
متاسفانه کدهای شما صحیح نمیباشد.
سه مسئله اینجا وجود دارد که باید جداگانه متوجه شوید و کدصحیحش را بنویسید.
1) درج دیتای جدید به DataTable به صورت مستقیم یا غیر مستقیم تا به گراید هم اضافه شود.
2) حرکت سطرجاری گراید به رکورد تازه درج شده.
3) ذخیره دیتاها در دیتابیس اصلی و به صورت پایدار و نهایی.
-----
آیا روشی که من برای Update استفاده کردم درست است؟
آیا برای درج رکورد جدید نیازی به دستورات زیر وجود دارد؟
اول مورد 3 را توضیح میدهم...
الف)
معمولاً در دات نت و با گراید رفتار عادی چنین است که دیتا را فقط به DataTable اضافه میکنیم و کاربر مثلاً 10 یا 20 سطر جدید اضافه میکند و تا این زمان تغییرات به دیتابیس اصلی اعمال نشده است...
بعد کاربر دکمه Save را در برنامه کلیک میکند و تازه در این زمان کل تغییرات به صورت یکجا ذخیره میشود...
یک چیزی شبیه برنامه های عادی غیر بانک اطلاعاتی (!) که تا وقتی فرمان Save را خودتان ندهید تغییرات ذخیره نمیشوند و یا موقع خروج از برنامه در خصوص ذخیره سازی تغییرات سوال میشود...
امیدوارم متوجه شده باشید چه میگویم؟
اگر این روند ذکر شده را بخواهید انجام دهید باید از DataAdapter و فرمان Update استفاده کنید تا کلیه تغییرات DataTable شما یکجا در دیتابیس اصلی اعمال شود (شامل درج و ویرایش و حذف) اگر این روش را خواستید توضیح بیشتر میدهم.
ب)
اگر این روند را نمیخواهید و میخواهید به دکمه Save در برنامه نداشته باشید یا حداقل درج هموراه به طور خودکار Save و اعمال شود و فوراً در لحظه به بانک اضافه شود، باید از شی Command استفاده کنید که اگر این روش را خواستید توضیح میدهم.
-----
1) و 2)
در کد قبلی شما، شما همینطوری یک DataView ساخته اید و اضافه کرده اید، این هیچ فایده ای ندارد.
بهترین راه آن است که یک DataView روی فرم قرار دهید، یعنی به نمایه Design بروید و DataView را از Toolbox خود VS روی فرم رها کنید.
سپس ...
خصیصه Table از dataView را به جدول مورد نظر تنظیم کنید و
خصیصه DataSource از DataGrid را به DataView ست کنید.
سپس از کدی شبیه این استفاده کنید:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
قله بلند
01-01-2009, 22:51
اگر این روند ذکر شده را بخواهید انجام دهید باید از dataadapter و فرمان update استفاده کنید تا کلیه تغییرات datatable شما یکجا در دیتابیس اصلی اعمال شود (شامل درج و ویرایش و حذف) اگر این روش را خواستید توضیح بیشتر میدهم.
ب)
اگر این روند را نمیخواهید و میخواهید به دکمه save در برنامه نداشته باشید یا حداقل درج هموراه به طور خودکار save و اعمال شود و فوراً در لحظه به بانک اضافه شود، باید از شی command استفاده کنید که اگر این روش را خواستید توضیح میدهم.
[/code]
با عرض سلام
خواهش می کنم این دو مورد رو حتماً توضیح دهید چون نکات مهمی هستند. هم برای من و هم برای کسی یا کسانی که بعداً این تاپیک رو نگاه می کنن.
فوق العاده از زحماتتون ممنونم
قله بلند
02-01-2009, 00:14
سلام
اولین قطعه کد مربوط به Form1_Load است.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
من در خصیصه DataView - خاصیت Table را دیدم ولی نمی شد نام جدول را به آن نسبت داد. حتی یک لینک مانند هم نداشت که نام جدول مورد نظرم را در آن انتخاب کنم.
تا این قسمت مشکلی نیست؟ درست جدول شماره صفر از dataset را به dataview1 نسبت داده ام؟
حالا رویداد button1_click
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگر مشکلی در کد وجود نداشته باشه، به نظر جواب منطقی است. در هر جدولی رکورد تازه درج شده می رود در سطر آخر. حالا من در ثبت وقایع در بانک مشکل دارم. با ثبت داده در بانک، سطر تازه درج شده از خصوصیت جدول مورد نظر باید تبعیت کند و لزوماً سطر تازه درج شده دیگر در آخر جدول نمی ایستد بلکه سر جای واقعی خود می رود. خیلی دوست دارم بعد از ثبت داده در بانک، وضعیت جدید را ببینم.
سلام
اگر این روند ذکر شده را بخواهید انجام دهید باید از dataadapter و فرمان update استفاده کنید تا کلیه تغییرات datatable شما یکجا در دیتابیس اصلی اعمال شود (شامل درج و ویرایش و حذف) اگر این روش را خواستید توضیح بیشتر میدهم.
همانطور که با متد Fill از DataAdapter اطلاعات را از دیتابیس به DataTable بارگذاری میکنید با متد Update میتوانید برعکس این رفتار را انجام دهید و تغییرات DataTable را به DataBase اعمال کنید.
ولی ...
برای Fill یک Command که متناظر دستور SELECT در SQL باشد، کافی است.
اما برای Update شما نیاز به سه Command دیگر دارید، متنار با دستورات INSERT و UPDATE و DELETE.
این سه Command را هم میتوانید دستی بسازید (که معمولاً خیلی بازدهی بیشتری دارد) ولی چون باید پارامترهم اضافه کنید و خصوصیتهای پارامترها را تک به تک و به دقت تنظم کنید، اینکار برای اغلب افراد کمی مشکل است نتیجتاً به عنوان راه حل سریع و بدون مشکل میتوانید از شی SqlCommandBuilder جهت تولید خودکار این سه Command از روی دستور SELECT اقدام کنید.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا DataAdapter شما حاضر است و به راحتی میتوانید با فرمان Fill اطلاعات را از دیتابیس به RAM منتقل کنید و با فرمان Update تغییرات RAM را به دیتابیس اعلام و نهایی کنید.
اگر این روند را نمیخواهید و میخواهید به دکمه save در برنامه نداشته باشید یا حداقل درج هموراه به طور خودکار save و اعمال شود و فوراً در لحظه به بانک اضافه شود، باید از شی command استفاده کنید که اگر این روش را خواستید توضیح میدهم.
Datatable برای داده های حجمی و DataSet مناسب است ولی برای کار روی یک سطر اطلاعات استفاده مستقیم از Command تفاوت بازدهی بسیار بیشتری دارد.
کدی شبیه این
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
البته میتوان یک Command و Connection را یکبار تولید و بارها استفاده کرد ولی در این صورت باید به چند نکته دقت شود.
1- حدالمقدور کدی تهیه شود که در پایان استفاده نهایی تمام این اشای صراحتاً Dispose و نابود شوند.
2- در یک برنامه شبکه ای با حجم تراکنش بالا، شاید چندان عقلانی نباشد که یک Connection به مدت طولانی و بلا استفاده باز و بی مصرف رها شود.
3- هر Connection و Command در هر لحظه فقط و فقط قادر به اجرای یک درخواست و دستور هستند پس در برنامه های چند ریسمانی نباید برای صرفه ای در ساخت این اشای از انها به طور اشتراکی استفاده کرد.
-----
اگر مشکلی در کد وجود نداشته باشه، به نظر جواب منطقی است. در هر جدولی رکورد تازه درج شده می رود در سطر آخربا کدفعلی قائدتاً اگر sort گراید را هم تغییر دهید نباید مشکلی در select سطر تازه درج شده داشته باشید.
با ثبت داده در بانک، سطر تازه درج شده از خصوصیت جدول مورد نظر باید تبعیت کند و لزوماً سطر تازه درج شده دیگر در آخر جدول نمی ایستد بلکه سر جای واقعی خود می رود. خیلی دوست دارم بعد از ثبت داده در بانک، وضعیت جدید را ببینم
متاسفانه هنوز کمی بحث را درک نکرده اید، این مطلب که شما گفتید کلاً مشکلی ایجاد نخواهد کرد.
مگر مشکل شما این نیست که سطر درج شده همواره خودکار در گراید select شود؟
خوب منبع گراید DataView است، نه دیتابیس!
اگر با ADO کار میکردیم شاید مطلب و نگرانی شما منطقی بود چون ADO سیستمی آنلاین دارد ولی ...
ADO.Net یک سیستم آفلاین است و دیتای RAM راتباطی با دیتای اصلی دیتابیس ندارد و در این ارتباط قطع شده تا ترافیک شبکه کاهش یابد و فقط در موقع لزوم با دستوراتی مثل Fill و Update برای لحظه ای این تبادل دیتا انجام میشود.
-----
پیشنهاد میکنم اگر واقعاً به برنامه نویسی علاقه مند هستید و فقط یک کار موضعی و موقت دانشجویی در جهت کسب نمره نمیخواهید انجام دهید، برای حل مشکلات بنیادین و تقویت کامل پایه ای خود برای حال و آینده حتماً یک کتاب ADO.Net تهیه و مطالعه کنید.
موفق باشید.
قله بلند
02-01-2009, 01:33
حتماً این کتاب رو تهیه می کنم و می خونم. در این کار فهمیدم که اونچیزی که بلد بودم اصلاً کارایی نداره. این کار که تموم بشه و تحویل بدم حتماً این کار رو خواهم کرد. چون وقت زیادی ندارم.
قله بلند
02-01-2009, 03:31
سلام
من تسلیمم!!
آدرس فایل WA3 رو در آدرس زیر گذاشتم:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مسلماً شما جدول مورد نظر رو درون بانکتون ندارید.
من از روش دوم برای ثبت داده ها در بانک استفاده می کنم. یعنی بدون دکمه save . مستقیماً داده رو درون بانک ذخیره می کنم.
گیج گیج ام و از طرفی هم نمی خوام وقتتون رو بگیرم و از طرفی دیگر هم می ترسم که این مطلب جالب رو نفهمم و از دستش بدم.
قله بلند
02-01-2009, 04:41
با سلام
آیا این قطعه کد می تونه کمک بکنه؟
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مثلاً فرض کنیم که من تازه اومدم و این سوال رو پرسیدم و همچنان دارم از روش قدیمی خودم استفاده می کنم. حالا به جایی که از حلقه ها استفاده کنم تا به سطر تازه درج شده برسم، از کد بالا استفاده کنم و به سطر تازه درج شده برسم ولی اینبار با حلقه درونی خود dataview .
ولی نمی دونم جای object[] Key چی بگذارم. دو فیلد رکوردی که قرار درج بشه ، یکی عدد صحیح و دیگری رشته است. شیء رو چگونه درست کنم؟
اصولاً این راه ، راه خوبی است؟ یا من اشتباه می کنم؟
قله بلند
02-01-2009, 04:46
پیشنهاد میکنم اگر واقعاً به برنامه نویسی علاقه مند هستید و فقط یک کار موضعی و موقت دانشجویی در جهت کسب نمره نمیخواهید انجام دهید، برای حل مشکلات بنیادین و تقویت کامل پایه ای خود برای حال و آینده حتماً یک کتاب ado.net تهیه و مطالعه کنید.
لطفاً کتاب هایی رو که خوب هستند و مطالبشون مفید هست رو بفرمایید تا بخرم. آخه بعضی کتابها مطلب آنچنانی ندارند.
کتاب ado.net کافی است یا همراه بودن آن با کتابی دیگر را نیز توصیه می کنید؟
تجربه شما در حال حاضر بسیار گرانقدر است. هر آنچه شما بفرمایید بدون شک درست و راهگشاست.
قله بلند
02-01-2009, 06:12
با سلام.لطفاً به این قطعه کد توجه کنید.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
کد مورد نظر را از آدرس زیر پیدا کردم:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ولی باز هم نشد. مهم پر کردن vals .
سلام
ولی نمی دونم جای object[] Key چی بگذارم. دو فیلد رکوردی که قرار درج بشه ، یکی عدد صحیح و دیگری رشته است. شیء رو چگونه درست کنم؟
...ولی باز هم نشد. مهم پر کردن vals .
این باید فقط و فقط حاوی primnarykey شما باشد.
چون کلید شما دو فیلدیاست، میشود چیزی شبیه این:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
کتاب ado.net کافی است یا همراه بودن آن با کتابی دیگر را نیز توصیه می کنید؟
معمولاً دوست دارم نام خاصی را بیان نکنم.
شما هر کتابی با عنوان ADO.NET تهیه کنید میتوانید مفید باشد.
طبیعی است که خوادندن کتابهای دیگر هم میتواند موثر باشد، مثلاً در خصوص SQL و SQLServer و یا مباحث دیگر برنامه نویسی که در جاهای دیگر مفید هستند... ASP.Net و API و عموم کتابهای #C و...
من کدتان را اصلاح کردم که الآن به نظر من کاری را که خواسته اید انجام میدهد. و در 2005 هم باز میشود.
) درج دیتای جدید به DataTable به صورت مستقیم یا غیر مستقیم تا به گراید هم اضافه شود.
2) حرکت سطرجاری گراید به رکورد تازه درج شده.
3) ذخیره دیتاها در دیتابیس اصلی و به صورت پایدار و نهایی.
rapidshare.com/files/178978959/WA3.zip
رفاموش نکنید جدول EmployeeTerritories در دیتابیس نمونه Northwind با جداول Employees و Territories رابطه دارد و مقادیر درجی شما باید از قبل در این دو جدول وجود داشته باشند.
موفق باشید.
قله بلند
02-01-2009, 16:16
سلام
من با خاصیت Find از DataView به مقدار سطر دست یافتم. خاصیت FindRows از DataView یک کلیکسیون بر می گردونه . وقتی راه ساده تر Find هست دیگه راه سخت تر رو نرفتم. به جواب هم رسیدم
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
قله بلند
02-01-2009, 16:16
سلام
چقدر مرتب و دقیق. واقعاً مهندسی وار کار می کنید.
جناب -H2-
شما از تابع DBSaveAll() استفاده نکردید. یعنی اون رو جایی فراخوانی نکردید.کجا این تابع رو بگذارم؟
سلام
شما از تابع DBSaveAll() استفاده نکردید. یعنی اون رو جایی فراخوانی نکردید.کجا این تابع رو بگذارم؟
این کتد استفاده نشد.
اگر بخواهید کاربر بتوانید گراید را مستقیماً ویرایش کند و چیزی به خود گراید اضافه یا کم کند یا سطری را تغییر دهید و...
در نهایت میتوان کل تغییرات را با تابع مذکور به صورت یکجا ذخیره کنید.
(یعنی در همان تئوری دکمه Save دار مفید خواهد بود و باید در رویداد ان دکمه Save این متد فراخانی شود.)
وقتی راه ساده تر Find هست دیگه راه سخت تر رو نرفتم. به جواب هم رسیدم
شاید کد شما به نظر شما ساده تر باشد و performance بسیار پایی دارد و کندی سرعت و بازدهی را در تعداد سطرهای بالا احساس خواهید کرد.
ضمناً در برنامه واقعی و در پروزه واقعی دستوررات پیشبینی خطا و try را هم فراموش نکنید.
بهرحال خوشحالم که مشکلتان حل شد و موفق باشید.
قله بلند
02-01-2009, 21:08
با سلام
قطعه کد زیر تعداد سطرهای اضافه شده در dataView رو نشون می ده. مثلاً اگر در اثر عمل درج یک سطر اضافه شده باشه عدد یک رو بر می گردونه و اگر مثلاً دو تا سطر درج شده عدد دو رو نشون می ده.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
قله بلند
02-01-2009, 21:25
با عرض سلام و تشکر
من در آدرس زیر ، دو عکس و فایل قبلی را با اضافه کردن دو combobox در یک پوشه قرار دادم.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اشکال:
در عکس اول من می خواهم رکوردی را اضافه کنم. در عکس دوم Add انجام شده است. نشانگر به سطر آخر اشاره می کند. مگر نه اینکه سطر تازه درج شده باید در مکان دوم از DataGrid به کاربر نشان داده شود؟
سوال جدید:
همانطور که در فرم می بینید، دو تا کمبو باکس به جمع اشیاء قبلی اضافه شده است. عناصر این دو کمبو باکس دو فیلد نشان داده شده در dataGrid هستند. در combobox1 مقادیر ستون EmployeeId و combobox2 مقادیر ستون TerritoryID ریخته شده است.
من می خواهم عناصر هر دو کمبو باکس به صورت صعودی مرتب شوند و هر گاه کاربر مقداری را از هر کمبویی که مدنظرش بود انتخاب کرد ، سطر متناظر در dataGrid انتخاب شود.
از خاصیت DataView.sort استفاده می کنم ولی در آن واحد فقط یکی از کمبو ها sort می شود. از طرفی وقتی کمبوی مخصوص TerritoryID را sort می کنم ، با انتخاب عنصری از این کمبو دیگر سطر متناظر روی dataGrid انتخاب نمی شود.
شاید سوال کنید که چرا می خواهم این کار را انجام دهم؟
شما فرض کنید که به جای EmployeeId و TerritoryID ، نام و نام خانوادگی افراد درون این کمبو ها بود. برای کاربر همیشه ترتیب عناصر دارای اهمیت است.
شاید کاربر اسم کسی را در یاد داشته باشد ، با انتخاب نامی از کمبو، سطر متناظر از DataGrid مربوطه انتخاب شده و دیگر مشخصات این فرد ظاهر می شود.
وقتی مقادیر کمبو ها مرتب باشند انتخاب کاربر سریعتر خواهد بود و تمایل کاربر به کار با برنامه بیشتر خواهد بود.
قله بلند
05-01-2009, 00:33
با سلام
همین الان یک راه جالب را دیدم و آن اینکه داده های درون کمبو را به ListArray منتقل کنیم و با خاصیت Sort() آن ، داده ها را مرتب کنیم.
هنوز روش کار نکردم ولی چگونه داده های درون کمبو باکس را به ListArray منتقل کنم و چگونه دوباره ListArray را به کمبو باکس تبدیل کنم؟
عجب مطلب جالبی است
قله بلند
05-01-2009, 17:59
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
جواب:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در صورتی که این دستور کار نمی کنه و تولید خطا می کنه.
با روش زیر می شه arraylist رو پر کرد :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و از دستور زیر هم به دنبال قطعه کد بالا ایراد می گیره:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
منابعی که ازشون استفاده کردم:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
قله بلند
06-01-2009, 02:18
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
با این هم می شه، ArrayList رو پر کرد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ولی وقتی داده ای از کمبو باکس انتخاب می شه، هیچ عکس العملی روی datagrid اتفاق نمی افته.
با این هم می شه، ArrayList رو پر کرد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ولی باز هم همون نتیجه همیشگی!
سلام
متاسفانه وقت کم دارد، شرمنده!
به سوال خصوصی یکی از دوستان ساعت 4:10 صبح جواب دادم. بحرحال متاسفم زودتر نوانستم جواب دهم.
=====
قطعه کد زیر تعداد سطرهای اضافه شده در dataView رو نشون می ده. مثلاً اگر در اثر عمل درج یک سطر اضافه شده باشه عدد یک رو بر می گردونه و اگر مثلاً دو تا سطر درج شده عدد دو رو نشون می ده.
کارکرد این دستور شرایط خاصی دارد ضمن اینکه اگر تعداد آیتمهای DataTable زیاد باشد، با کاهش بازدهی مواجه خواهید شد و فائیده اش را برایتان درک هم نمیکنم!
در عکس اول من می خواهم رکوردی را اضافه کنم. در عکس دوم Add انجام شده است. نشانگر به سطر آخر اشاره می کند. مگر نه اینکه سطر تازه درج شده باید در مکان دوم از DataGrid به کاربر نشان داده شود؟
نخیر!
تا وقتی که گراید یا DataView صراحتاً به sort خاصی تنظیم شوند، این عمل انجام نمیشود.
من می خواهم عناصر هر دو کمبو باکس به صورت صعودی مرتب شوند..
..از خاصیت DataView.sort استفاده می کنم ولی در آن واحد فقط یکی از کمبو ها sort می شود...
کنترلر combobox مجهز به خصوصیت Sorted است که باید true اش کنید. یا از دو DataView مجزا استفاده کنید.
ولی یک راست نمیتوانید از مقادیر موجود در DataTable استفاده کنید...
چون مقادیر دو فیلد شما با هم منحصر به فرد هستند (غیر تکراری) و هر کدام جداگانه میتواند بارها تکرار شود، نتیجتاً در کامبوها حالتی پیش می آید که از یک آیتم چندین بارخواهید دید.
برای رفع این مشکل یا باید از LINQ استفاده کنید (که در نسخه 2008 در دسترس است) یا اینکه خودتان دیتاهای غیر تکراری را در collection یا array جداگانه ای برای تغذیه کامبوها ذخیره کنید.
... هر گاه کاربر مقداری را از هر کمبویی که مدنظرش بود انتخاب کرد ، سطر متناظر در dataGrid انتخاب شود...
از تابع DataView.Find استفاده کنید و جفت مقادیر کامبو را بدهید تا ایندکس سطر مورد نظر پیدا شود و گراید را به ایندکس مورد نظر ست کنید(اگر ایندکس منفی نباشد)
... با انتخاب عنصری از این کمبو دیگر سطر متناظر روی dataGrid انتخاب نمی شود...
...ولی وقتی داده ای از کمبو باکس انتخاب می شه، هیچ عکس العملی روی datagrid اتفاق نمی افته...
گمان نمیکنم انتظار داشته باشید برای عملی کدنویسی نکنید و خودش خود به خود انجام شود!!! اگر اینطور باشد که دیگر برنامه نویس نمیخواهد!
(البته میشد این کار را به نوعی خودکار هم انجام داد ولی باید کلیدتان یکتا میبود یا با یک کنترلر و سطح اضافه در قابل یک کنترلر واحد یکتایش میکردید!
همین الان یک راه جالب را دیدم و آن اینکه داده های درون کمبو را به ListArray منتقل کنیم و با خاصیت Sort() آن ، داده ها را مرتب کنیم.
هنوز روش کار نکردم ولی چگونه داده های درون کمبو باکس را به ListArray منتقل کنم و چگونه دوباره ListArray را به کمبو باکس تبدیل کنم؟
با توجه به وجود دیتا در DataTable کپی گرفتن بیمورد از این دیتا منطقی نیست، ولی نیاز به این کار احتمالاً خواهید داشت، نه به علت مشکل sort که با یک true و false خصوصیت Sorted حل میشود بلکه به دلیل همان دیتاهای تکراری که یک آیتم میتواند چندین بار در کامبو تکرار شود.
در صورتی که این دستور کار نمی کنه و تولید خطا می کنه.
...با روش زیر می شه arraylist رو پر کرد...
...با این هم می شه، ArrayList رو پر کرد:...
همانطور که گفتم sort اصلاً مشکلی ندارد و ایجاد نمیکند، مشکل شما که انگار خودتان نمیدانید، دیتاهای تکراری است و شما باید کدی بنویسید که این دیتاهای تکراری را حذف کند
و از دستور زیر هم به دنبال قطعه کد بالا ایراد می گیره
..ولی باز هم همون نتیجه همیشگی...
ValueMember در صورتی کار میکند که دیتای منبع شما خصیصه ای با این نام داشته باشد یا خصیصه defualt ای با ورودی string داشته باشد.
شما یا باید آرایه ای از DataRow ها تشکلی دهید و از ValueMember استفاده کنید،
یا آرایه ای از String یا Int تشکیل دهید و از ValueMember استفاده نکنید.
=====
موفق باشید.
قله بلند
06-01-2009, 23:08
با سلام. من از سه تا DataView استفاده کردم تا سه فیلد از جدول Employees را بتونم اداره کنم. در این جدول EmployeeID کلید اصلی است و از نوع Identity است.lastname و FirstName نیز فیلدهای دوم و سوم این جدول را نشان می دهند.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
من از رویداد SelectedIndexChanged برای دو کمبو باکس حاوی LastName و Firstname استفاده کردم. در اینجا textBox3 به فیلد EmploeeyID اشاره می کند.(نمی دانم شاید اصلا وجودش لازم نباشد)
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در قطعه کد زیر ، وقتی می خواهم سه عنصر EmploeeyID ، FirstName و LastName را پیدا کنم، نمی توانم texbox3.text ار نیز در بین texbox2.text و texbox1.text قرار دهم زیرا در جدول EmploeeyID از نوع Identity است ولی خوبی ان این بود که در جدول EmployeeTerritories فقط از نوع int بود.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حتی اگر از یک dataview نیز استفاده کنم و خاصیت sorted را برای کمبو باکس true کنم ، باز هم همان مشکل باقی است. وقتی از کمبو ها انتخاب می کنم ، سطر متناظرش در datagrid1 انتخاب نمی شود.
سلام
Error because "EmployeeID" in "Employeey Table" is an identity
شما قبول دارید که در جدول شما EmployeeID یکتا نیست و میتواند بارها تکرار شود؟؟؟؟
چطور انتظار دارید، آدرس بدهید "تهران پلاک 14" و طرف منزل مورد نظر را پیدا کند؟؟؟ مگر یک پلاک 14 وجود دارد؟؟؟
- کلید یکتای جدول شما جفت EmployeeID و TerritoryID با هم هستند.
شما باید جفت مقدار EmployeeID و TerritoryID را با هم بدهید تا آدرستان تکمیل شود و فقط و فقط یک سطر پیدا شود که ایندکسش قابل بازپس دادن باشد.
- راه دیگر این است که قبول دارید EmployeeID به تنهایی ممکن است چندین عدد باشد ولی برای شما پیداکردن اولین مورد کافی است و نیازی به موارد دیگر ندارید، که در این صورت باید از DataTable.Select به همراه DataView.Find استفاده کنید.
قله بلند
07-01-2009, 02:01
با سلام
در پست قبلی ام از جدول Emploeeies استفاده کرده ام که دارای کلید منحصر به فرد EmploeeyID است.
مثل اینکه پست قبلی ام را کامل نخواندید و یا به خاطر تشابه اسمی این دو جدول ، ان را مطالعه نکردید.
به هر حال: من تا یک قدمی جواب پیش رفته ام ولی نمی دانم چرا یک خطای عجیب صادر می شود:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
نمی دونم چرا از str_LastName ایراد می گیره. می گوید: رشته ورودی در قالب مناسب نبست. در حالی که رشته تهی نیست و همه چیز درست است.
در واقع از این قسمت ایراد می گیرد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
سلام
در پست قبلی ام از جدول Emploeeies استفاده کرده ام که دارای کلید منحصر به فرد EmploeeyID است.
مثل اینکه پست قبلی ام را کامل نخواندید و یا به خاطر تشابه اسمی این دو جدول ، ان را مطالعه نکردید.
آخه از اول بشریت این تاپیک صحبت روی EmployeeTerritories بوده یکدفعه شد Employees با روش یک خط در میان خواندن من مشکل ساز شد!:31:میبخشید.:11:
نمی دونم چرا از str_LastName ایراد می گیره. می گوید: رشته ورودی در قالب مناسب نبست
مقدار EmployeeID یک عدد int است، احتمالاً با (int.Parse(str_LastName مشکل حل خواهد شد.:20:
قله بلند
07-01-2009, 03:41
با سلام فراوان، به بلندای یافتن جواب
یک مورد فوق جالب:
وقتی رویداد comboBox_SelectedIndexChanged صدا زده می شود، یک اتفاق جالبی می افتد که در مورد comboBox_SelectionChangeCommitted صادق نیست.
رویداد comboBox_SelectionChangeCommitted صبر می کند تا کاربر مقداری را از کمبو باکس انتخاب کند. یعنی ساکت و بی آزار و اذیت است و تا وقتی که از او کاری نخواسته اید و پا روی دمش نگذاشته اید ، کاری به کار شما ندارد،
امـــــــــــــــــــــــ ـــــا
جناب comboBox_SelectedIndexChanged، اصولاً به هر کاری کار دارد و هنوز فرم بارگذاری نشده(load نشده) ، خود را فرا می خواند. مشکل از اینجا شروع می شود که قبل از بار گذاری فرم ، ما valuemember نداریم، پس به جای یک مقدار واقعی، مقدار رشته ای System.Data.DataRowView باز گردانده می شود.
پس معلوم شد که قبل از بار گذاری فرم ، ما اصلاً مقداری برای جستجو در تابع Find نداریم ،برای همین است که خطای زیر را صادر می کند:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا راهش چیست که از این مهلکه خلاص شویم؟
یک راهش استفاده از رویداد comboBox_SelectionChangeCommitted است. تمام کدهای گفته شده در رویداد comboBox_SelectedIndexChanged را به درون رویداد comboBox_SelectionChangeCommitted منتقل کنید.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و اما راه دوم:
راهی نداریم مگر اینکه جلوی فراخوانی رویداد comboBox_SelectedIndexChanged را قبل از بارگذاری فرم بگیریم.
چگونه؟
فعلاً نمی دانم.
قله بلند
07-01-2009, 03:48
سلام
آخه از اول بشریت این تاپیک صحبت روی employeeterritories بوده یکدفعه شد employees با روش یک خط در میان خواندن من مشکل ساز شد!
خواهش می کنم. شما استاد هستید. اگر راهنمایی های شما نبود که به جواب نمی رسیدم.
قله بلند
07-01-2009, 04:13
با سلام
یک عدد جواب برای مشکل comboBox_SelectedIndexChanged که در پست قبل مطرح کرده بودم یافتم. هنوز امتحانش نکردم ولی انگار جوابی رویایی است. به ترتیب سه خط کد زیر دقت کنید.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
منبع:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
همون طور که مشکل من حل شد، امیدوارم مشکل دوستانم هم که بعداً این تاپیک رو مشاهده می کنند نیز حل شود.
در پناه حق
سلام
در هر صورت انگار مشکلتان حل شده ولی اصول کار اینطور است که هر مقداری از ورودی را قبل از مصرف اعتبار سنجی کنید مثلاً:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
یا در این مورد خاص شاید کد زیر بهتر باشد...
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
تا حد امکان به ورودی های کاربران از کنترلرها غیر مطمئن و مشکوک باشید(!) و فکر هر ورودی و شرایطی را از ورودی داشته باشید تا برنامه تان مستحکم شود و در شرایط غیر معمول و خاص هم همچنان صحیح کار کند.
موفق باشید.
قله بلند
07-01-2009, 15:57
قطعه کد زیر ، کد کامل استفاده از comboBox_SelectedIndexChanged است:
Combobox3 محل ذخیره سازی FirstName است و Combobox2 برای LastName .
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
قطعه کد زیر ، کد استفاده از comboBox_ SelectionChangeCommitted است:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و پـــــــــــایـــــــــان
قله بلند
07-01-2009, 16:01
تا حد امکان به ورودی های کاربران از کنترلرها غیر مطمئن و مشکوک باشید(!) و فکر هر ورودی و شرایطی را از ورودی داشته باشید تا برنامه تان مستحکم شود و در شرایط غیر معمول و خاص هم همچنان صحیح کار کند.
با سلام
به نظر دیگر داده Null تولید نمی شود. با این کدها دیگر از تولید داده تهی جلوگیری می شود.
ممنون از همه کمک ها و همه همراهیتان.
واقعاً از این بحث لذت بردم و توشه ای از علم اندوختم.
قله بلند
10-01-2009, 02:00
جمع بندی
1-سوال: اشاره کمبو باکس به سطر تازه درج شده
جواب: دادهای که قرار است درج شود به طریقی نگهداری شود. مثلاً با یک TextBox یا یک داده از نوع رشته. حالا این داده کاراکتری را به صورت زیر به کمبوباکس مورد نظر نسبت می دهیم .
mycombobox.text=mystring
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پست ششم
2-سوال:یافتن آخرین سطر از dtaGrid
جواب: توسط کد زیر:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پست دهم
3-یک نمونه کد که توسط جناب -H2- و در VS2008 نوشته شده است. موضوع این پست راجع به جدول EmployeeTerritories و دو فیلد این جدول با نامهای EmployeeID و TerritoryID است. این جدول از دو جدول Employees و Territories مشتق شده است. این جدول در پایگاه داده Northwind قرار دارد.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پست هیجدهم
4-نمونه کد بالا در VS2005 که توسط جناب -H2- تبدیل شده است:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پست بیست و یکم
5-کاری را که خودم انجام دادم و آن را برای اشکالگیری در آدرس زیر گذاشتم:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پست سی و ششم
6-یافتن جوابی برای DataView.Find و پیدا کردن سطر مورد نظر از طریق این دستور:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پست چهل و یکم
7-عملی که DataView.FindRows انجام می دهد برای یافتن تعداد سطرهای تاثیر گرفته از یک تراکنش:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پست چهل و چهارم
8-سوال: مطرح کردن سوالی در مورد مرتب سازی دو کمبو باکس به صورت صعودی و انتخاب شدن سطر مورد نظر در DataGrid بعد از انتخاب داده مورد نظر در کمبوباکس
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پست چهل و پنجم
9-راه های پُر کردن DataList (DataList راهی برای مرتب سازی داده درون DataView)
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پستهای چهل و هفتم و چهل و هشتم
10-جوابی بر سوال های مطرح شده در پست های 44، 45، 46، 47 و 48 توسط جناب -H2-:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پست چهل و نهم
11-استفاده از جدول Employees از پایگاه داده Northwind با سه فیلد EmployeeID (کلید اصلی)، LastName و FirstName برای مرتب سازی دو کمبو باکس که حاوی LastName و FirstName هستند. البته این جدول فیلدهای دیگری هم دارد ولی در اینجا قابل استفاده نیستند. در این پست سوالی نیز راجع به comboBox_SelectedIndexChanged مطرح می شود.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پست پنجاهم
12-یافتن جوابی برای سوال مطرح شده در پست پنجاهم: comboBox_SelectionChangeCommitted
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پست پنجاه و چهارم
13-جوابی برای comboBox_SelectedIndexChanged
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پست پنجاه و ششم
14-تلفیق پست های پنجاه و چهارم ، پنجاه و ششم و پنجاه و هفتم در پست پنجاه و هشتم
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پست پنجاه و هشتم
چند نکته:
1-هرگاه بخواهید از از دستور DataView.Find برای یافتن شماره سطر مورد نظر استفاده کنید باید DataView را مرتب کنید. اگر DataView را با یک فیلد مرتب می کنید ، لیستی از object در تابع Find تشکیل نمی شود ولی هرگاه DataView را با ییش از یک فیلد مرتب کنید باید به ترتیب آنها را در لیست اشیاء متذکر شوید. مثلاً اگر DataView را با LastName و FirstName مرتب کنید و مثلاً مانند همین برنامه ، LastName را در textbox1 و FirstName را در textbox2 ذخیره کنید باید در تابع Find اینگونه بنویسید:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
2-اعتبار سنجی داده قبل از استفاده آن به استحکام برنامه کمک می کند. مانند هر آنچه در پست 57 به آن اشاره شده است.
3- سه راه برای شمارش تعداد سطرهای تاثیر گرفته بعد از تراکنش وجود دارد:
مقدار برگشتی دستور ExecuteNonQuery که مشخص کننده تعداد سطرهای تاثیر گرفته بعد از تراکنش است. این مقدار یک عدد صحیح است. از عدد صفر به بالا.
شمارش تعداد سطرهای DataGrid که در پست دهم به دستور آن اشاره شده است.
استفاده از دستور DataView.FindRows که در پست چهل و چهارم به آن پرداخته شده است.
4-با استفاده از دستور زیر یا به صورت ویزاردی ، اجازه مرتب سازی dataGrid را از کاربر بگیرید زیرا با مرتب سازی دلخواه کاربر ، برنامه کار نخواهد کرد.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و همچنان آماده یادگیری مطالب جدید هستم.
قله بلند
zahra1372
09-01-2014, 19:55
سلام من همین مشکلو دارم. کلید یه سطر وارد شده تو دیتا گرید ویو رو دارم ولی نمیتونم ایندکسش رو بدست بیارم.
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.