PDA

View Full Version : چطور میشه فیلدها ی تویه دیتاگرید رو محدود کرد؟



Downward
جمعه 14 مرداد 1384, 18:37 عصر
سلام خدمت دوستان:
چطور میشه فیلدها ی توی data grid رو محدود کرد .
من یه data grid دارم که وقتی از تویه دیتا بیس اطلاعات به اون bind میشه چون طول اطلاعات زیاده
data grid از عرض کش میاد و شکله تمامه صفحه رو به هم میزنه راهی هس که بشه اینو محدود کرد.میشه اون تکستی که تو data grid به نمایش در میاد بجای اینکه تو یه خط به نمایش در بیاد به چند خط شکست؟
اون اطلاعاتی که باید نشون داده بشه یه کلمه بزرگه هیچ فاصله آی بین کلما ت اون نیست.
خاصیت wrap رو هم تنظیم کردم یه بار false و یه بار true ولی بازم همونجوی میشد.
حتی with رو هم برایه data grid تنظیم کردم ولی بازم نشد.
چیکار کنم؟
کالا فه شدم از بس باهاش ور رفتم. :(

Behrouz_Rad
جمعه 14 مرداد 1384, 19:59 عصر
با این شرطی که شما میگید - یک کلمه پیوسته از حروف بدون فاصله - هیچ راهی نداره.

Downward
شنبه 15 مرداد 1384, 13:51 عصر
با این شرطی که شما میگید - یک کلمه پیوسته از حروف بدون فاصله - هیچ راهی نداره.

شاید موقعی که اطلاعاتو وارد می کنم باید کاری انجام بدم؟ نظر شما چیه؟
اطلاعات از طریق text box وارد data base میشه. (sql server )

Behrouz_Rad
شنبه 15 مرداد 1384, 15:51 عصر
خیر نیاز به کاری نیست.
خاصیت Wrap بر مبنای کلمات کار می کنه نه حروف.
بنابراین حتی اگر طول ثابتی برای یک TD تعریف کرده باشید هم Wrap کارساز نیست. چون فاصله ای میان حروف کلمه شما وجود نداره تا کلمه ای که اضافه هست به خط بعد منتقل بشه.

Happy_davood
شنبه 15 مرداد 1384, 19:31 عصر
سلام
خوب اگر عبارت بدون فاصله باشه که اصلاً هیچ امکانی برای حفظ شدن Style صفحه وجود نداره .

ولی اگر براتون ممکنه می تونید هنگامیه که سطرهای Grid تولید میشه عبارات داخل ستونها رو محدود کنید . مثلاً بگید هر ستون نمیشه بیشتر از 50 کاراکتر نشون بده حالا چه با فاصله و چه بدون آن . اگه این روش به دردتون بخوره بگید تا روش رو بگم .

Downward
یک شنبه 16 مرداد 1384, 08:59 صبح
سلام
خوب اگر عبارت بدون فاصله باشه که اصلاً هیچ امکانی برای حفظ شدن Style صفحه وجود نداره .

ولی اگر براتون ممکنه می تونید هنگامیه که سطرهای Grid تولید میشه عبارات داخل ستونها رو محدود کنید . مثلاً بگید هر ستون نمیشه بیشتر از 50 کاراکتر نشون بده حالا چه با فاصله و چه بدون آن . اگه این روش به دردتون بخوره بگید تا روش رو بگم .
سلام
ممنون که همفکری می کنید.
این روشی که شما گفتین باعث میشه که کل اطلاعات نمایش داده نشه.
ولی فکر کنم تنها راه باشه. لطفا روش رو بگین.
موفق باشین.

Happy_davood
یک شنبه 16 مرداد 1384, 09:59 صبح
سلام
بله در این روش همه اطلاعات نشون داده نمیشه .
خوب من یه فکر دیگه هم به ذهنم رسید ، ببینید این چه طور هست اگه به دردتون نخورد دوباره روی اولی بحث میکنیم .
من خودم این مشکل رو در سیستم جامع اصناف داشتم . برای حلش اومدم و از iFrame استفاده کردم . یعنی Grid رو داخل iFrame قرار دادم . هر وقت که عرض Grid زیاد میشه Frame دارای Scroll میشه و در عوض کل Style صفحه حفظ میشه . ضمناً iFrame رو با Frameset عوضی نگرید ها چون این یکی بهتر هست .
از طرفی این روش خیلی هم اصولی هست دیگه . مثلاً شما برنامه های عادی ویندوز رو در نظر بگیرید . در اونجا هم اگه طول Grid زیاد باشه ، عرض فرم ثابت می مونه ولی در عوض Scroll بار ظاهر میشه . اگه شما هم از iFrame استفاده کنید ، درست مثل این هست که یک WindowsApp پیاده کردید .
خوب حالا هر کدوم رو پسند کردید ، بفرمائید تا در صورت نیاز بیشتر بحث کنیم .

Downward
یک شنبه 16 مرداد 1384, 11:09 صبح
سلام
بله در این روش همه اطلاعات نشون داده نمیشه .
خوب من یه فکر دیگه هم به ذهنم رسید ، ببینید این چه طور هست اگه به دردتون نخورد دوباره روی اولی بحث میکنیم .
من خودم این مشکل رو در سیستم جامع اصناف داشتم . برای حلش اومدم و از iFrame استفاده کردم . یعنی Grid رو داخل iFrame قرار دادم . هر وقت که عرض Grid زیاد میشه Frame دارای Scroll میشه و در عوض کل Style صفحه حفظ میشه . ضمناً iFrame رو با Frameset عوضی نگرید ها چون این یکی بهتر هست .
از طرفی این روش خیلی هم اصولی هست دیگه . مثلاً شما برنامه های عادی ویندوز رو در نظر بگیرید . در اونجا هم اگه طول Grid زیاد باشه ، عرض فرم ثابت می مونه ولی در عوض Scroll بار ظاهر میشه . اگه شما هم از iFrame استفاده کنید ، درست مثل این هست که یک WindowsApp پیاده کردید .
خوب حالا هر کدوم رو پسند کردید ، بفرمائید تا در صورت نیاز بیشتر بحث کنیم .
بله شما درست میگین . اتفاقاً خود من هم به این فکر کرده بودم ولی اینجو ری ظاهره قشنگی نداره.
درضمن ربرو ریه این تکست یه دکمه برایه edit هس که اینجور ای زیاد قشنگ نیس که سکرو ل بخوره چون اون وقت اون دکمهه پیدا نمیشه.

فکر میکنم اولی بهتر باشه چون اطلاعاتی که میخوام نشون بدم ادّرسه سایت و اگه همش معلوم نشه اشکالی ایجاد نکنه.
اون اول ها خودش 1 بار یکی از اونها رو به چند خط شکست و تو 3 خط نشون داد.
ولی بعداً دیگه اینجوری نشد.به کد هم دست نزده بودم. کد همون کد بود.

Happy_davood
یک شنبه 16 مرداد 1384, 17:37 عصر
]وب اگر قرار هست آدرس نشون بدید که جریان ناقص نشان دادن به درد نخورد .
حالا یک سئوال : دوست عزیز شما خدا رو می خواهی یا خرما رو . خوب باید تکلیف رو مشخص کنید .
حق دارید Scroll خوب دیده نمیشه و از به هم خوردن صفحه که بهتره . ضمناً اگه صفحه رو حالا با این دید و پیش فرض طراحی کنید که Scroll هم خواهد بود یقیناً می تونید چیزی درست کنید که علیرغم Scroll خوب هم دیده بشه . آخه شما قبلاً این موضوع رو حدس نمیزدید .

Happy_davood
یک شنبه 16 مرداد 1384, 17:40 عصر
راستی یک چیز دیگه به جای اینکه بیاییم و سطر ها رو ک کنیم که مثلاً اگر از 50 کاراکتر بیشتر بودند بقیه عبارت رو حذف کنیم این کار رو بکنیم :
از همین تکنیک استفاده کرده و اگر سطری بیشتر از مثلاً 50 کاراکتر عرض داشت یه تگ <br> بزاریم تا بیاد سطر پایین . خوبه . یعنی عبارات طولانی رو مجبور به شکستن کنیم ! نظر شما چیه ؟

dot_net_lover2
یک شنبه 16 مرداد 1384, 20:44 عصر
واسه پیاده سازی این تکنیک هنگام ذخیره سازی Data اگر مثلا هر 50 کرکتر یک Space اضافه کنید ، هنگام فراخوانی به طور خودکار به دو سطر یا بیشتر متن مورد نظر میشکنه، ولی خارج از Grid شکل جالبی ندارد.

Happy_davood
دوشنبه 17 مرداد 1384, 09:27 صبح
نه دوست عزیز شما هنگام ذخیره سازی این کار رو انجام ندهید . چون اصلاً قرار نیست که ما داده ها رو خراب کنیم . شما هرجوری که هست ذخیره کنید و فقط هنگام نمایش در Grid با استفاده از امکان ItemDataBound اونها رو شکسته و نمایش دهید .

Downward
سه شنبه 18 مرداد 1384, 09:27 صبح
سلام
اولا عذر می خواهم که یکم دیر جواب می دم.
آقای dot_net_lover2 آقای happy_davood درست میگن. چون نباید داده ها رو دستکاری کنیم. برای اینکه باید به صورت لینک نما یش داده بشن
آقای happy_davood شما نظر خوبی دادین اگه بشه یه تگ بزاریم خیلی خوبه
ولی چه جوری باید این کارو انجام بدم.
من یه فکره دیگه هم کرده بودم البته بیشتر با نظر شما مو افق هستم.
میخواستم مثل جی میل اون آخرشنو 3 تا نقطه بزارم ولی کلشو تو ToolTip نما یش بدم.
ولی اینطوری که شما میگین خیلی بهتره. چطوری باید این کارو بکنم.
ممنون

Happy_davood
سه شنبه 18 مرداد 1384, 11:58 صبح
سلام
خوب این کار خوشبختانه ساده است .
فرض کنیم شما داده ها رو کامل وارد DB کردید و حتی Grid رو هم راه اندازی کردید و Grid هم در حال کار هست . کنترل DataGrid یک Event داره به نام ItemDataBound . هنگامی که Grid تشکیل میشه این Event به ازای هر سطر Grid یک بار صدا زده میشه و ما هم درست همینجا کار خودمون رو انجام خواهیم داد . فرض کنید این دادهای شما که طولشون هم زیاد هست مثلاً در ستون دوم از Grid قرار گرفتند :


private void OnItemDateBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemIndex != -1)
{
string CurrentCell = e.Item.Cell[1].Text.ToString();

CurrentCell = CurrentCell.SubString(0, 50);
CurrentCell += " . . . ";

e.Item.Cell[1].Text = CurrentCell;
}
}
خوب اولاً ItemIndex برای سطر اول یا همون Title برابر منهای 1 خواهد بود که با استفاده از یک شرط اون رو بیخیال شدیم . بعد ستون مورد نظر از سطر فعلی رو برمی داریم . بعد کارمون رو روش انجام داده و میزاریم سرجای خودش .
البته من اینجا از آخرش حذف کردم ولی شما می تونید مثلاً از هر 50 کاراکتر یه تگ BreakLine وارد کنید .
داود

Downward
سه شنبه 18 مرداد 1384, 15:49 عصر
سلام
آقا دست شما درد نکنه. نمیدونستم که event OnItemDateBound وجود داره.
خیلی جالبه. از کد شما استفاده کردم البته به vb تبدیل کردم.



Public Sub OnItemDateBound33(ByVal s As Object, ByVal e As DataGridItemEventArgs)
If e.Item.ItemIndex <> -1 Then
Dim currentcell As String
currentcell = e.Item.Cells(0).Text.ToString()
currentcell = currentcell.Substring(0, 50)
currentcell += "..."
e.Item.Cells(1).Text = currentcell
End If
End Sub

ولی نمیدونم چرا فقط برای BoundColumn جواب میده و برای HyperLinkColumn جواب نمیده.
من امتحان کردم برای HyperLinkColumn که متاسفانه مال من هم همینه error زیر رو میده:
Index and length must refer to a location within the string. Parameter name: length
از این خط error می گیره:


currentcell = currentcell.Substring(0, 50)

ستون اول من


e.Item.Cells(0)

HyperLinkColumn هستش وستون دوم من


e.Item.Cells(1)

BoundColumn هستش. که برای اولی error میده .

Happy_davood
سه شنبه 18 مرداد 1384, 17:50 عصر
خوب در این جور مواقع باید از اسم کنترل استفاده کنید :


CurrentCell = ((LinkButton)e.Item.FindControl("LinkName")).Text.ToString();

می بینید که من با استفاده از اسم کنترل ، خود کنترل رو بدست آورده و از پراپرتی Text اون استفاده کردم .
فقط یادتون باشه که عبارت (LinkButton) رو حتماً قرار بدید چون ممکنه مثلاً کنترل شما LinkButton نباشه و یک کنترل دیگه باشه .

Downward
چهارشنبه 19 مرداد 1384, 10:40 صبح
سلام
ولی کنترل asp: HyperLinkColumn که نه name داره نه id .
درضمن منظور شما رو از LinkButton متوجه نشدم . vb این کد رو هم نتونستم بسازم.

mp2009
دوشنبه 02 مهر 1386, 22:09 عصر
دوستان کسی میتونه بگه برای datalist چگونه میشه یکی از lable هایی که به یه فیلد از جدول bind شده رو کاری کنیم کی بیشتر از 100 حرف نشون نده
کمک کنید

eworkpro
دوشنبه 23 مهر 1386, 07:02 صبح
سلام . آقا من هم همین سوال رو دارم که چه طوری مثلا تو دیتالیست یا دیتاگرید یک label از یک فیلد را محدود کنیم . مثلا فیلد توضیحات رو 50 کلمه اش رو بنویسه و بعد سه نقطه ؟
خواهشن کمک

mahdi_negahi
دوشنبه 23 مهر 1386, 09:16 صبح
من این کارو کردم البته یک ذره کار داره

توضیح : صفحه جزئیات بل آمدن موس روی آن سطری که سه نقطه دارد نمایش داده میشود

eworkpro
سه شنبه 24 مهر 1386, 06:02 صبح
خوب عزیز چطوری ؟ این که فقط یک عکسه ؟!

mahdi_negahi
سه شنبه 24 مهر 1386, 07:45 صبح
خوب عزیز چطوری ؟ این که فقط یک عکسه ؟!
گذشتم عکس که ببینم به درد دوستان میخوره یا نمیخوره


حوب اول در رویداد RowDataBound خطهای زیر را اضافه کن توضیح اینکه lbl_Desc یک label ای است که احتمال میرود طولش از 26 کاراکتر بیشتر شود

protected void grv_Master_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
Label lbl_Des = ((Label)e.Row.FindControl("lbl_Desc"));
if (lbl_Des.Text.Length > 25)
{
lbl_Des.Attributes.Add("title", "header=[جزئیات] body=[" + lbl_Des.Text + "] cssbody=[dvbdy1] cssheader=[dvhdr1] ");
lbl_Des.Text = lbl_Des.Text.Remove(26);
lbl_Des.Text = lbl_Des.Text.Insert(26, "...");
}
}


خوب فایل جاوا اسکریپت هم برات گذاشتم

eworkpro
چهارشنبه 25 مهر 1386, 07:00 صبح
ممنون و سپاس از شما دوست عزیز