PDA

View Full Version : تفسیر مقادیر فیلدهای GridView



mohammad973
پنج شنبه 10 اسفند 1391, 18:25 عصر
سلام حضور همه عزیزان برنامه نویس !
یه سوال GridView ای دیگه برام پیش اومده که خیلی خیلی برام مهمه . خواهش میکنم مثل همیشه به این سوالم هم پاسخ بدید .

فرض کنید GridView ی من 5تا ستون داشته باشه . یکی از نوع اینها از بولین باشه . میخوام به جای اینکه بصورت چک باکس نشون داده بشه توی GridView ، مقدار اون فیلد برای هر سطر تحلیل بشه ، اگر صفر بود مقدار "ناموجود" و اگر یک بود "موجود" رو بگذاره و بعد از اینکارا GridView رو نشون بده .
همچنین موقع ذخیره داده ها توی دیتابیس ، عکس این عمل رو انجام بده . یعنی برای هر سطر ، اگر در GridView "موجود" داشتیم True و اگر "ناموجود" داشتیم False داخل دیتابیس ذخیره کنه .

ممنون میشم پاسخ بدید . :قلب:

m_akbari11
پنج شنبه 10 اسفند 1391, 20:23 عصر
سلام.
یک تابع در Code Behind بنویسید و در هنگام بایند کردن کنترل درون Grid ابتدا نام اون تایع رو بنویسید و سپس فیلد بایند شده

ASPX:

ImageUrl='<%GetSEX(Eval("Vaziat")) %>'



Code Behind

protected string GETSEX(object MessageId)
{
if (MessageId.tostring()=="1")
return "مرد";

else

return "زن";

}

mohammad973
جمعه 11 اسفند 1391, 18:42 عصر
دوست من ؛ این راه رو امتحان کردم ولی جواب نمیده ! خطا میده ! بجای Eval از Bind استفاده کردم . این خطا رو میده :


The name 'Bind' does not exist in the current context E:\Project\WebApplication\Private\Users\Site'sUser s.aspx

mohammad973
جمعه 11 اسفند 1391, 19:24 عصر
کدی که شما دادی ، با Eval صحیحه و دقیقا همون چیزیه که من میخوام .
منتها ، چندتا مشکل هست . Eval فقط بدرد این میخوره که اطلاعاتی رو از دیتابیس بگیرمو نمایش بدم . حالا اگر خواستم اونو ویرایش کنم چی ؟؟؟؟!!!! برای همین دنبال راهی هستم برای استفاده از Bind ! راهی بنظرتون نمیرسه ؟

zerocool151
جمعه 11 اسفند 1391, 19:34 عصر
یک ItemTemplate درست کن و یک :label بزار توش

Text = '<%# Eval("Column") ? "ناموجود" : "موجود" %>'

Bind هم به همین ترتیب

mohammad973
جمعه 11 اسفند 1391, 19:38 عصر
ممنون دوست عزیز ؛ میشه درباره این کد کمی توضیح بدی ؟
تستش میکنم و جوابشو میگم . منتها ، بنظرت کار منو راه میندازه ؟؟؟؟

mohammad973
جمعه 11 اسفند 1391, 19:50 عصر
دوستان تشکر میکنم از تمامی عزیزانی که توی این مشکل باهام هم فکری کردند ! مشکلم حل شد . راهی که استفاده کردم رو براتون میگذارم ، بلکه برای کسی مفید واقع بشه :

سوال : (قسمت اول سوال:)داخل GridView یک ستون دارم که بولی هست . هنگاک بارشدن GridView میخوام به چک باکس تیک خورده ، مقدار "موجود" رو درج کنه و به جای چک باکس بدون تیک ، مقدار "ناموجود" . (قسمت دوم سوال:) حالا اگر اونو ویرایش کردیم و متن "موجود" را به "ناموجود" تبدیل کردیم ، داخل دیتابیس بصورت بولی ذخیره کنه !


راهی که پیاده کردم ::

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



<asp:TemplateField HeaderText="وضعیت" SortExpression="P_state">
<EditItemTemplate>
<asp:CheckBox ID="Vazeiat" runat="server" Checked='<%# Bind("P_State") %>' />
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Vazeiat" runat="server" Text='<%# exchangType(Eval("P_State")) %>' />
</ItemTemplate>
</asp:TemplateField>


همونطور که پیداست ، برای نمایش فیلد ، از ItemTemplate استفاده کردم و داخل اون یک لیبل گذاشتم و خاصیت Text اون رو برابر کدی که دوست عزیزمون در پست 2 همین تاپیک گفتند قرار دادم . کد زیر رو هم داخل CodeBehind صفحه قرار دادم :


if (a.ToString() == "False") return "ناموجود";
else return "موجود";


منتها این فقط برای نمایش درسته . حالا برای اینکه برای ویرایش هم مشکلی نداشته باشیم از یه EditItemTemplate استفاده کردم و این بار از یه چک باکس استفاده کردم و خاصیت Checked اون رو Bind کردم نه Eval !

zerocool151
جمعه 11 اسفند 1391, 19:51 عصر
یک if سادس
اگه مقدار eval برابر true باشه شرط اول اجرا میشه،اگه false باشه شرط دوم که همون نا موجود است
در مورد bind تست نکردم
خودت یکم ور برو ok میشه

mohammad973
جمعه 11 اسفند 1391, 19:54 عصر
یک if سادس
اگه مقدار eval برابر true باشه شرط اول اجرا میشه،اگه false باشه شرط دوم که همون نا موجود است
در مورد bind تست نکردم
خودت یکم ور برو ok میشه


ممنون .مدت زیادی بود #C کار نکرده بودم ، فراموش کرده بودم !!! بازم تشکر !

mohammad973
جمعه 11 اسفند 1391, 20:57 عصر
دوستان ، یه سوال درباره همین موضوع :
توی مثال بالا از CheckBox استفاده کردیم ؛ راه حل برای عنصری مثل DropDownList چطوری میشه ؟ چون چندتا عنصر داریم !

ahmad156
جمعه 11 اسفند 1391, 21:35 عصر
دوست عزیز کامل ترین روش استفاده از event مربوط به گریدویو به نام DataRowBound هست که به ازای بایند هر سطر اجرا میشه که شما به اون سطر دسترسی دارین هم میتونین مقادیرش رو عوض کنین یا پنهان کنین یا ...
مثلا در مثال زیر من میخوام به ستون وضعیت براساس مقدار فیلد isInPolygon عکس متفاوتی بدم(البته به صورت پیش فرض عکس داره )

if (e.Row.RowType == DataControlRowType.DataRow)
{
int isInPolygon = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "isInPolygon"));
if (isInPolygon == 0)
{
Image img = (Image)e.Row.FindControl("imgIsInPolygon");
img.ImageUrl = "../images/icn_warning.png";
img.ToolTip = "ثبت در بیرون از موقعیت نعیین شده";
}
}

یا اگر بخواهید که ستونی رو مخفی کنین

if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Header)
e.Row.Cells[4].Visible = false;

mohammad973
جمعه 11 اسفند 1391, 22:23 عصر
ممنون از لطف شما دوست عزیز . کدتون کمی برا سخته ، ولی تجزیه و تحلیلش میکنم ، بنظر حرفه ای و فوق العاده مفید میاد .
منتها فعلا راهی که استفاده کردم رو هم میگم ، مخصر و مفیده ::


<asp:TemplateField HeaderText="جنسیت" SortExpression="P_gender">
<EditItemTemplate>
<asp:DropDownList ID="Gender_ddl" SelectedValue='<%# Bind("P_gender") %>' runat="Server">
<asp:ListItem Text="مرد" Value="False"></asp:ListItem>
<asp:ListItem Text="زن" Value="True"></asp:ListItem>
</asp:DropDownList>
</EditItemTemplate>
<InsertItemTemplate>
<asp:DropDownList ID="Gender_ddl" SelectedValue='<%# Bind("P_gender") %>' runat="Server">
<asp:ListItem Text="مرد" Value="False"></asp:ListItem>
<asp:ListItem Text="زن" Value="True"></asp:ListItem>
</asp:DropDownList>
</InsertItemTemplate>
</asp:TemplateField>