PDA

View Full Version : سوال: تفاوت تربیت ستونهای DataGrid در محیط طراحی و اجرا



NIK
دوشنبه 17 مهر 1391, 13:43 عصر
سلام

من یک گرید طراحی کردم اما هنگامی که برنامه اجرا میشه ، ترتیب چیدمان ستونها با محیط طراحی من فرق میکنه.
علت چیه؟
تشکر

morteza271
دوشنبه 17 مهر 1391, 14:35 عصر
شاید یه جایی از کدتون خاصیت DisplayIndex از ستون های گریدتون رو تغییر دادین!!!!!!

NIK
دوشنبه 17 مهر 1391, 15:13 عصر
نه تغییر ندادم. فقط نکته ای که هست اینه که این گرید از دیتابیس پر میشه. ترتیب ستونها در حالت عادی مثل ترتیب جدول دیتابیسه.
اما من یه ستون غیر دیتابیسی ایجاد کردم و مشکل هم همون ستونه.
من میخوام اون ستون آخرین ستون باشه. قبل از بایند کردن دیتا هم ترتیب درسته اما به محض اینکه دیتا رو بایند میکنم اون ستون میشه ستون سوم.

abcd_a
دوشنبه 17 مهر 1391, 17:07 عصر
سلام
به همون ترتیبی که ستونها در دیتا گرید وبو قرار دارد به همون ترتیب هم در دستور select فیلدها را بنویس درست میشه

saeed.8350028
دوشنبه 17 مهر 1391, 17:27 عصر
آقا این مشکل من هم هست لطفا اگه کسی می دونه کمک کنه.
من هم یک ستون غیر بایند شده اضافه می کنم، می شه ستون اول! ولی من می خوام بشه ستون آخر. یعنی ستون های بایند شده من اول بیان بعد ستون غیر بایند شدم.مرسی

abcd_a
دوشنبه 17 مهر 1391, 18:19 عصر
من هم این مشکل داشتم به این ترتیبی که تو پست 3 گفتم نوشتم درست شد

NIK
سه شنبه 18 مهر 1391, 08:14 صبح
من هم این مشکل داشتم به این ترتیبی که تو پست 3 گفتم نوشتم درست شد

دوست من مشکل ترتیب ستون های دیتابیسی نیست.
من فیلدهایی که از دیتابیس میارم تو گرید مشکلی نداره. فقط یه ستون دارم که از دستور Select مقدار نمیگیره و چک باکسه. تا قبل از بایند کردن دیتا مشکلی نیست اما به محض اینکه دیتا بایند میشه اون ستون از ستون آخر به ستون سوم تغییر مکان میده.
مشکل رو به این صورت حل کردم که در دستور Select یک فیلد با مقدار خالی به نام اون فیلد گرفتم و ستون گرید رو دیتابیسی کردم که عملا مقدار خالی از دیتابیس در اون ریخته میشه.
درسته که حل شد اما این روش، روش درستی نیست. میخواستم بدونم کسی هست این مشکل رو برطرف کرده باشه.
در ضمن من از Entity Framework استفاده میکنم و مجبور شدم به خاطر همین یه دونه ستون که جا به جا میشه، یه View درست کنم.
تشکر از همه دوستان

veniz2008
سه شنبه 18 مهر 1391, 08:27 صبح
سلام. وقتی یه ستون رو بصورت دستی به گرید اضافه میکنید( یعنی با Add Column) برای اینکه ترتیب حفظ بشه باید برای بقیه فیلدها هم ستون ایجاد کنی. یعنی دقیقا به تعداد فیلدهایی که در select برمیگردونی، درون گرید باید ستون اضافه کنی. تنها نکته ای که هست باید خاصیت DataPropertyName هر ستون رو دقیقا برابر با نام فیلدتون بذارید.
موفق باشید.

NIK
سه شنبه 18 مهر 1391, 16:17 عصر
سلام. وقتی یه ستون رو بصورت دستی به گرید اضافه میکنید( یعنی با Add Column) برای اینکه ترتیب حفظ بشه باید برای بقیه فیلدها هم ستون ایجاد کنی. یعنی دقیقا به تعداد فیلدهایی که در select برمیگردونی، درون گرید باید ستون اضافه کنی. تنها نکته ای که هست باید خاصیت DataPropertyName هر ستون رو دقیقا برابر با نام فیلدتون بذارید.
موفق باشید.

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

veniz2008
سه شنبه 18 مهر 1391, 17:07 عصر
دقیقا همین کار انجام شده. یعنی ستونها به صورت دستی ایجاد شده و به وسیله DataPropertyName مقدار به اونها بایند میشه.
فقط ستونی که دستی ایجاد کردم مقدار DataPropertyName نداره.
در قسمت datapropertyname خودت نام فیلد رو تایپ کن.

morteza271
سه شنبه 18 مهر 1391, 17:24 عصر
این کد رو در سازنده فرمت بنویس ببین درست میشه!
dataGridView1.AutoGenerateColumns = false;

اگه درست نشد کد زیر رو بعد از اینکه داده های جدول رو میخونی و بهش میدی بنویس :
dataGridView1.Columns["ColumnName"].DisplayIndex = dataGridView1.Columns.Count - 1;

البته نباید نیاز به این باشه ولی از اونجایی که دیدم مشکل شما حل نمیشه اینو گفتم.
موفق باشید

NIK
چهارشنبه 19 مهر 1391, 08:03 صبح
در قسمت datapropertyname خودت نام فیلد رو تایپ کن.

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


1
dataGridView1.AutoGenerateColumns = false;



اگه این پروپرتی رو برابر False قرار بدید، دیگه ستونهای گرید از دیتاسورس مقدار نمی گیرند.


dataGridView1.Columns["ColumnName"].DisplayIndex = dataGridView1.Columns.Count - 1;

در پست 7 عرض کردم که مشکل برطرف شد که البته به روش غیر اصولی برطرف شد. تغییر ایندکس ستون شاید بتونه مشکل رو برطرف کنه اما روش اصولی نیست.

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

تشکر به خاطر راهنماییتون و وقتی که گذاشتید

veniz2008
چهارشنبه 19 مهر 1391, 08:44 صبح
منظور من از نسبت دادن datapropertyname به ستون، ستونی بود که بصورت دستی تعریف کرده بودید و طبق گفته خودتون در پست 9 این ستون مقدار دهی نشده بود. بهر حال زمانیکه گرید رو مستقیما به دیتاسورس وصل کنی(روش ویزاردی) ،نام فیلدها درون datapropertyname وجود دارند و نیازی به تایپ کردن نام فیلدها نیست. ولی اگر با کد نویسی(روش غیر ویزاردی) بخوای کوئری رو درون گرید نمایش بدی اونوقت باید خاصیت datapropertyname رو خودت برای هر ستون تایپ کنی. بهرحال سعی ما این بود که مشکل شما حل بشه.
موفق باشید.

morteza271
چهارشنبه 19 مهر 1391, 08:55 صبح
اگه این پروپرتی رو برابر False قرار بدید، دیگه ستونهای گرید از دیتاسورس مقدار نمی گیرند.

اشتباه می کنید دوست عزیز.
با False کردن پراپرتی AutoGenerateColumns مشکلی پیش نمیاد البته به شرطی که خاصیت datapropertyname رو مقداردهی کرده باشین.

این کار باعث میشه که مثلا اگه دستور Select شما 5 ستون داره ولی شما میخواین که 4 تا از ستون ها رو نمایش بدین(حالا به هر دلیلی) اون ستون پنجم نمایش داده نمیشه!
ولی اگه این کد رو نذارین ستون پنجم هم به طور اتوماتیک به گردیتون اضافه میشه حتی اگه شما ستونی براش در نظر نگرفته باشین!

می گین نه امتحان کنید.

در ضمن در مورد مشکلتون هم که میگین غیراصولی درست شد به احتمال زیاد شما یه جایی از کارتون سوتی دادین وگرنه مطمئن باشید این مشکل پیش نمیومد!من هم قبلا این مشکل رو داشتم ولی خیلی ساده برطرف شد و اصلا نیاز به کد نویسی خاصی نداشت.بستگی به نحوه Bind کردن DataSource و چیدمان ستونها در Design داره.

موفق باشید.

NIK
چهارشنبه 19 مهر 1391, 09:49 صبح
اشتباه می کنید دوست عزیز.
با False کردن پراپرتی AutoGenerateColumns مشکلی پیش نمیاد البته به شرطی که خاصیت datapropertyname رو مقداردهی کرده باشین.

این کار باعث میشه که مثلا اگه دستور Select شما 5 ستون داره ولی شما میخواین که 4 تا از ستون ها رو نمایش بدین(حالا به هر دلیلی) اون ستون پنجم نمایش داده نمیشه!
ولی اگه این کد رو نذارین ستون پنجم هم به طور اتوماتیک به گردیتون اضافه میشه حتی اگه شما ستونی براش در نظر نگرفته باشین!

می گین نه امتحان کنید.

در ضمن در مورد مشکلتون هم که میگین غیراصولی درست شد به احتمال زیاد شما یه جایی از کارتون سوتی دادین وگرنه مطمئن باشید این مشکل پیش نمیومد!من هم قبلا این مشکل رو داشتم ولی خیلی ساده برطرف شد و اصلا نیاز به کد نویسی خاصی نداشت.بستگی به نحوه Bind کردن DataSource و چیدمان ستونها در Design داره.

موفق باشید.

حق با شماست. با GenerateMember اشتباه گرفتم.:خجالت:

درباره سوتی هم احتمالا حق باشماست. اما من گرید رو پاک کردم و یکی دیگه درست کردم. دوباره همین مشکل بود.

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

هر چی فکر میکنم نمی دونم اشکال ممکنه از کجا باشه.

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

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

فکر میکردم پروژه های ویندوزی خیلی راحت تر از وب هستند اما انگار ویندوزی ها هم مشکلات خاص خودشون رو دارند.

باز هم تشکر از شما و mohammaddou (http://barnamenevis.org/member.php?155296-mohammaddou) به خاطر وقتی که واسم میزارید.

morteza271
چهارشنبه 19 مهر 1391, 09:57 صبح
اگه امکانش هست پروژتون رو یا بخشی از کدتون رو بذارین شاید متوجه شیم مشکل از کجاست.
به هر حال نباید اینطوری باشه و با کلک رشتی هم مشکل رو حل کردن بعدا خودش دردسر میشه.
شاید اگه برنامه تون باشه بتونم کمکتون کنم.

veniz2008
چهارشنبه 19 مهر 1391, 11:35 صبح
ببینید دوست عزیز. راه اصولیش اینه که از یک روش برای پر کردن گرید استفاده کنید.(یا روش ویزاردی یا با کدنویسی که توصیه میکنم با کدنویسی این کا رو انجام بدید. یه بار تست کنید ضرر نمیکنید). همونطور که قبلا هم گفتم به تعداد فیلدهایی که میخواید نمایش بدید ستون در گرید اضافه کنید و خاصیت datapropertyname رو برای هر ستون برابر با نام فیلد قرار بدید. ستون هایی رو هم که دوست ندارید نمایش داده بشن میتونید خاصیت visable اونها رو false کنی. من خودم شخصا در تمام برنامه هام از این روش استفاده میکنم.