Re: dynamically building template columns
- From: jonefer <jonefer@xxxxxxxxxxxxxxxxxxxxxxxxx>
- Date: Fri, 25 May 2007 11:13:00 -0700
Thank you for answering the post.
Yes. I realize that sorting can be turned off for a particular column by
setting its SortExpression to an empty string BUT how do you do that for
columns that are sometimes there and sometimes not?
I found another article that lets me Format AutoGenerateColumns in an
ASP.NET Grid - The Code Project- ASP.NET
But the author doesn't go as far as tapping into the SortExpression for the
header.
Here is an example of his routine that should be referenced in the
OnRowDataBound event as follows
<asp:GridView id = "MyList" runat = "server"
AutoGenerateColumns-"true"
OnRowDataBound= "GV_RowDataBound"
private void GV_RowDataBound(object o, GridViewRowEventArgs e)
{
// apply custom formatting to data cells
if (e.Row.RowType == DataControlRowType.DataRow)
{
// set formatting for the category cell
TableCell cell = e.Row.Cells[0];
cell.Width = new Unit("120px");
cell.Style["border-right"] = "2px solid #666666";
cell.BackColor = System.Drawing.Color.LightGray;
// set formatting for value cells
for(int i=1; i<e.Row.Cells.Count; i++)
{
cell = e.Row.Cells[i];
// right-align each of the column cells after the first
// and set the width
cell.HorizontalAlign = HorizontalAlign.Right;
cell.Width = new Unit("90px");
// alternate background colors
if (i % 2 == 1)
cell.BackColor
= System.Drawing.ColorTranslator.FromHtml("#EFEFEF");
// check value columns for a high enough value
// (value >= 8000) and apply special highlighting
if (GetCellValue(cell) >= 8000)
{
cell.Font.Bold = true;
cell.BorderWidth = new Unit("1px");
cell.BorderColor = System.Drawing.Color.Gray;
cell.BorderStyle = BorderStyle.Dotted;
cell.BackColor = System.Drawing.Color.Honeydew;
}
}
}
// apply custom formatting to the header cells
if (e.Row.RowType == DataControlRowType.Header)
{
foreach (TableCell cell in e.Row.Cells)
{
cell.Style["border-bottom"] = "2px solid #666666";
cell.BackColor=System.Drawing.Color.LightGray;
}
}
}
I imagine that what I want to set is in the last part with the Header Cells.
However, I don't know what property to tap into to get to the sort expression.
I've only found luck tapping into it using ItemTemplates.
If you have any ideas, I'm stoked!
"CaffieneRush@xxxxxxxxx" wrote:
TemplateFields are an overkill if you just want to control sorting.
individual columns.
Sorting can be turned off for a particular gridview column by setting
it's SortExpression to an empty string.
Andy
On 23 May, 04:01, jonefer <jone...@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote:
Ok, I found a good article of how to dynamically build template columns
The reason I want to use this is so that I can only set certain columns to
be sortable.
what I'm trying to do is read the value of a column - for example if the
column reads 'General Course' in the first 14 letters... I want that field to
be sortable
So here is the call that actually builds and populates my gridview - I just
wonder why I can't change any properties in the template?
lCount = tb_ActionList.GetActionList(sSL, sDIR, sSup, sLocName,
sDeptName, "Gen").Tables("qActionGrid_GEN").Rows.Count
If lCount = 0 Then
ShowGrid(False)
Me.lblCheck.Text = "No records match the selected criteria"
With Me.lblCheck
.ForeColor = Drawing.Color.Red
End With
Else
'try dynamic adding of template columns
For Each col As DataColumn In ds.Tables("qActionGrid_Gen").Columns
Dim bfield As TemplateField = New TemplateField
bfield.HeaderTemplate = New
GridViewTemplate(ListItemType.Header, col.ColumnName)
bfield.ItemTemplate = New
GridViewTemplate(ListItemType.Item, col.ColumnName)
Dim colchk As String = Left(col.ColumnName, 14)
'If colchk = "General Course" Then
bfield.SortExpression = col.ColumnName
'End If
'bfield.ItemStyle.Font.Names
gvActionList.Columns.Add(bfield)
Next
'=======================================
gvActionList.DataSource = ds
gvActionList.DataBind()
Here is the class
Public Class GridViewTemplate
Implements ITemplate
Private _templateType As ListItemType
Private _columnName As String
Public Sub New(ByVal type As ListItemType, ByVal colname As String)
_templateType = type
_columnName = colname
End Sub
Sub InstantiateIn(ByVal container As System.Web.UI.Control) _
Implements ITemplate.InstantiateIn
Select Case _templateType
Case ListItemType.Header
Dim lbl As Label = New Label
lbl.Text = _columnName
container.Controls.Add(lbl)
' break
Case ListItemType.Item
Dim tb1 As TextBox = New TextBox
AddHandler tb1.DataBinding, AddressOf tb1_DataBinding
tb1.Columns = 4
container.Controls.Add(tb1)
' break
Case ListItemType.EditItem
' break
Case ListItemType.Footer
Dim chkColumn As CheckBox = New CheckBox
chkColumn.ID = "Chk" + _columnName
container.Controls.Add(chkColumn)
' break
End Select
End Sub
Sub tb1_DataBinding(ByVal sender As Object, ByVal e As EventArgs)
Dim txtdata As TextBox = CType(sender, TextBox)
Dim container As GridViewRow = CType(txtdata.NamingContainer,
GridViewRow)
Dim dataValue As Object = DataBinder.Eval(container.DataItem,
_columnName)
If Not (dataValue Is DBNull.Value) Then
txtdata.Text = dataValue.ToString
End If
End Sub
End Class
I feel I am so close to solving this... if I can just get these particular
columns to be searchable it would help me tremendously.
- Follow-Ups:
- Re: dynamically building template columns
- From: CaffieneRush@xxxxxxxxx
- Re: dynamically building template columns
- References:
- dynamically building template columns
- From: jonefer
- Re: dynamically building template columns
- From: CaffieneRush@xxxxxxxxx
- dynamically building template columns
- Prev by Date: Re: dynamically building template columns
- Next by Date: User control events
- Previous by thread: Re: dynamically building template columns
- Next by thread: Re: dynamically building template columns
- Index(es):
Relevant Pages
|