PDA

View Full Version : حرفه ای: تغییر محتوای فیلد برگشتی جهت نمایش در گرید



Dr.Bronx
دوشنبه 09 اردیبهشت 1392, 16:10 عصر
سلام .

فرض کنید که یک فیلد داریم با نام Status که مشخص می کنه که کاربر فعال هست یا نه . که به صورت صفر یا یک هست .
حالا قرار هست که مشخصات کاربران رو در یک Grid نمایش بدیم .

datatable پر میشه و به grid خودمون bind می کنیم .

حالا چطور میشه در گرید به جای نمایش ۱ مثلا بنویسیم فعال یا مثلا یک آیکون نمایش داده بشه و به جای صفر غیر فعال و غیره ...

زبان هم vb هست . چند جا هم جستجو کردم همه میگن با Rowdatabound باید کار کرد اما مثال کاملی وجود نداشت و هر کدوم یک اشکالی داشت .

با تشکر .

ahmad156
دوشنبه 09 اردیبهشت 1392, 17:38 عصر
اگه درست منظورتون رو متوجه شده باشم.
توی تابع زیر src یکی از ستون ها که Image رو براساس شرایط خاصی که فیلد IsInPolygon داره عوض میکنم

protected void gvForm_RowDataBound(object sender, GridViewRowEventArgs e)
{
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 = "ثبت در بیرون از موقعیت نعیین شده";
}
}

}

elahe471
دوشنبه 09 اردیبهشت 1392, 18:39 عصر
میتونید فیلد Boolean رو به TemplateFieldتبدیل کنید بعد به جای Checkbox توش یه Lable بزارید و Text Lable رو به شکل زیر Convert کنید :



<asp:Label ID="Label1" runat="server" Text='<%# Convert.ToBoolean(Eval("Comment_Read")) ? "درست" : "نادرست"%>'></asp:Label>



این برای متن بود ، برای Image هم به جای Lable دو تا عکس بزارید داخل Template Field یکی برای True و یکی False ، خاصیت Visible عکس درست رو بایند کنید به متغیر Boolean و Visible عکس غلط رو بایند کنید به نقیض فیلد Boolean

Dr.Bronx
دوشنبه 09 اردیبهشت 1392, 18:52 عصر
من کد رو به vb تبدیل کردم و البته کمی تغییر دادم که بتونم برای متن استفاده کنم

If e.Row.RowType = DataControlRowType.DataRow Then
Dim isInPolygon As Integer = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "art_publish"))

If isInPolygon = 1 Then

Dim txt As Label = DirectCast(e.Row.FindControl("art_publish"), Label)
txt.Text = "Test"

End If

End If

اما به قسمت txt.text = "test" اخطار میده و میگه Object reference not set to an instance of an object.

نکته ای که اینجا هست اینه که در همین کدهای شما آیا isInPolygon اسم فیلد هست ؟

اگر بله که خوب پس چرا اشکال میگیره و اگر نه که اون ها چی هستند ؟

با تشکر ./

Dr.Bronx
دوشنبه 09 اردیبهشت 1392, 18:54 عصر
میتونید فیلد Boolean رو به TemplateFieldتبدیل کنید بعد به جای Checkbox توش یه Lable بزارید و Text Lable رو به شکل زیر Convert کنید :



<asp:Label ID="Label1" runat="server" Text='<%# Convert.ToBoolean(Eval("Comment_Read")) ? "درست" : "نادرست"%>'></asp:Label>



این برای متن بود ، برای Image هم به جای Lable دو تا عکس بزارید داخل Template Field یکی برای True و یکی False ، خاصیت Visible عکس درست رو بایند کنید به متغیر Boolean و Visible عکس غلط رو بایند کنید به نقیض فیلد Boolean

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

با تشکر ./

ahmad156
دوشنبه 09 اردیبهشت 1392, 18:58 عصر
آره IsInPolygon اسم فیلد هست.
چه خطایی؟؟؟

Dr.Bronx
دوشنبه 09 اردیبهشت 1392, 19:11 عصر
آره IsInPolygon اسم فیلد هست.
چه خطایی؟؟؟

گفتم دیگه :‌Object reference not set to an instance of an object.

ahmad156
دوشنبه 09 اردیبهشت 1392, 19:42 عصر
مطمئنین اسم فیلد و ID کنترل مورد نظرتون رو درست نوشته باشین؟یا اصلا فیلدی با این نام توی DataSource گریدتون باشه؟
کد بالا رو من خیلی استفاده کردم و هیچ وقت خطا نداده!!!

Dr.Bronx
دوشنبه 09 اردیبهشت 1392, 19:56 عصر
قسمت دوم که میگه : e.Row.FindControl این Id کدوم کنترل رو باید بهش بدم ؟

ahmad156
دوشنبه 09 اردیبهشت 1392, 20:00 عصر
همون ستونی که میخواین تغییر بدین.ستون گرید من که تغییر میده به صورت زیر هست

<asp:TemplateField>
<ItemTemplate>
<asp:Image ID="imgIsInPolygon" runat="server" ImageUrl="../images/icn_succes.png" ToolTip="ثبت در موقعیت نعیین شده" />
</ItemTemplate>
</asp:TemplateField>

Dr.Bronx
دوشنبه 09 اردیبهشت 1392, 20:01 عصر
آهان . متوجه شدم

فراموش کرده بودم Templatefield رو .

ممنون .

Dr.Bronx
سه شنبه 10 اردیبهشت 1392, 10:08 صبح
این هم برای آیندگان ...

کد کامل توی VB میشه

Private Sub ArticlesGrid_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles ArticlesGrid.RowDataBound

If e.Row.RowType = DataControlRowType.DataRow Then
Dim IsThisEnable As Integer = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "art_publish"))
Dim txt As Label = DirectCast(e.Row.FindControl("lblStatus"), Label)

If IsThisEnable = 1 Then

txt.Text = "فعال"

Else

txt.Text = "غیر فعال"

End If

End If


End Sub

بعد موضوعی که می مونه اینه که بعد از این کار دیگه Sorting و Paging کار نمی کنه و خطا میده . که راه حلش این کد ها هست .

Private Sub ArticlesGrid_PageIndexChanging1(sender As Object, e As GridViewPageEventArgs) Handles ArticlesGrid.PageIndexChanging
ArticlesGrid.PageIndex = e.NewPageIndex
ArticlesGrid.DataBind()
End Sub

Private Function ConvertSortDirectionToSql(sortDirection__1 As SortDirection) As String
Dim newSortDirection As String = [String].Empty

Select Case sortDirection__1
Case SortDirection.Ascending
newSortDirection = "ASC"
Exit Select

Case SortDirection.Descending
newSortDirection = "DESC"
Exit Select

End Select

Return newSortDirection
End Function

Private Sub ArticlesGrid_Sorting(sender As Object, e As GridViewSortEventArgs) Handles ArticlesGrid.Sorting
Dim dataTable As DataTable = TryCast(ArticlesGrid.DataSource, DataTable)

If dataTable IsNot Nothing Then
Dim dataView As New DataView(dataTable)
dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection)

ArticlesGrid.DataSource = dataView
ArticlesGrid.DataBind()
End If
End Sub

یعنی عملیات رو باید به صورت دستی انجام بدیم .

موفق باشید ./