Ask a Question related to ASP.NET Data Grid Control, Design and Development.

  1. #1

    Default Row Selector Column

    I have created a custom control that dynamically creates a datagrid at
    runtime. The datagrid is made up of a collection of custom columns. One of
    my custom columns is a Row Selecter column. This comprises a Checkbox for
    each row and one in the header of datagrid.

    My row selection is working fine and I am able to loop through the selected
    items in my grid and perform an action on them. What I want to be able to
    do now is give the user the ability to select or un-select all rows by
    clicking the checkbox in the header.

    The trouble that I am experiencing is that the CheckChanged event of the
    checkbox in the header only fires if the value changes from the value that
    it is when it is dynamically created.

    Each postback causes my custom control to be built. When it is built the
    row selector column (clsDGCCheckBoxColumn) is added and the InitializeCell
    method adds a checkbox to the header column with the checked value = False.
    When the user checks this control, the SelectColumn method runs correctly.
    If the user unchecks the checkbox in the header, the SelectColumn method
    does not run. Im assuming that this is because the value of this control
    when it is built is False and when the user unchecks the control it is once
    again False, therefore the value has not changed therefore the event does
    not fire.

    Could someone advise me how to get around this problem - I guess that I need
    to modify InitializeCell so that the value that I set the checkbox to is as
    it was before postback.

    Thanks

    Terry Holland

    ##############################
    Custom CheckBox Column
    ##############################
    Imports System.Web.UI.WebControls
    Imports System.Web.UI
    Imports System.ComponentModel

    Public Class clsDGCCheckBoxColumn
    Inherits clsCustomDGC_BASE

    Public Sub New(ByVal objDGC As clsDataGridColumn)
    MyBase.New(objDGC, "chk")
    m_clrBackColor = System.Drawing.Color.LightCyan
    End Sub

    Public Overrides Sub InitializeCell(ByVal cell As TableCell, ByVal
    columnIndex As Integer, ByVal itemType As ListItemType)
    MyBase.InitializeCell(cell, columnIndex, itemType)

    Select Case itemType
    Case ListItemType.Header
    Dim ctl As CheckBox = New CheckBox
    ctl.AutoPostBack = True
    ctl.Checked = False
    cell.Controls.Add(ctl)

    AddHandler ctl.CheckedChanged, AddressOf SelectColumn '(Me,
    ctl.Checked)

    Case ListItemType.Item, ListItemType.AlternatingItem,
    ListItemType.EditItem, ListItemType.SelectedItem

    Dim ctl As CheckBox = New CheckBox
    SetControlProperties(cell, ctl)

    cell.Controls.Add(ctl)

    AddHandler cell.DataBinding, AddressOf Cell_DataBinding
    Case Else

    End Select
    End Sub

    Private Sub Cell_DataBinding(ByVal sender As Object, ByVal e As
    EventArgs)
    Dim cell As TableCell = sender
    Dim item As DataGridItem = cell.NamingContainer
    Dim ctl As CheckBox = item.FindControl(m_strID)
    Dim pd As PropertyDescriptor =
    TypeDescriptor.GetProperties(item.DataItem).Find(m _strDataField, True)

    Try
    Dim obj1 As Object = pd.GetValue(item.DataItem)

    ctl.Checked = CType(obj1, Boolean)
    Catch ex As Exception
    Throw New Exception("Invalid dataField for custom column
    clsDGCLabel")
    End Try
    End Sub



    Private Sub SelectColumn(ByVal sender As Object, ByVal e As EventArgs) '
    ByVal booSelect As Boolean)
    Dim ctlHeader As CheckBox = sender
    Dim grid As DataGrid = ctlHeader.NamingContainer.NamingContainer
    Dim booSelect As Boolean = ctlHeader.Checked

    Dim o As CheckBox

    For Each dgi As DataGridItem In grid.Items
    o = dgi.FindControl(m_strID)
    o.Checked = booSelect
    Next
    End Sub
    End Class




    Terry Holland Guest

  2. Similar Questions and Discussions

    1. css selector question
      Just wondering how I could effectually make a class style within another class style? The way I'm trying to do it is not working. The parent...
    2. How to use CSS selector in a component
      Hi guys, I want to add <mx:Style> in a component, and define font in it. But flex seems does not support css selector in a component. So is...
    3. Can one pass variables through a selector?
      In article <clund-50F2A4.12443709092003@amstwist00.chello.com>, C Lund wrote: Yes - either use an NSInvocation to perform the call, or call...
    4. Multiple CSS selector styles
      Looking at the BBC's site, saving it and importing it into Dreamweaver I can see that the BBC's site has multiple CSS selector tags for links. They...
    5. CSS and the ID selector
      I am having trouble getting the Dreamweaver CSS Styles palette/Properties palette to acknowledge ID based selectors. I can link to the external...
  3. #2

    Default RE: Row Selector Column

    Hi Terry,

    Welcome.
    Seems you're still on your way developing the custom DataGrid Columns :-).
    As for the CheckBox postback events problem you mentioned in this post, I
    think you assumption about the intializing setting on the Header
    CheckBox.Checked property(as false) is reasonable, and I've also
    encountered such problems when developing composite control with postback
    and status changes.. (Such control like CheckBox, TextBox's XXXchanged
    event is based on the comparation between the control instance's property
    value and the value retrieved from viewstate....) So have you tried
    removing the ctl.Checked = False line in the following code to see
    whether it helps?

    =============
    Select Case itemType
    Case ListItemType.Header
    Dim ctl As CheckBox = New CheckBox
    ctl.AutoPostBack = True
    ctl.Checked = False
    cell.Controls.Add(ctl)
    ============

    Also, as for "checking All", "Unchecking All" functionality, we can also
    consider use clientside script to make them all complete at clientside
    without postback...

    Thanks,

    Steven Cheng
    Microsoft Online Support

    Get Secure! [url]www.microsoft.com/security[/url]
    (This posting is provided "AS IS", with no warranties, and confers no
    rights.)


    --------------------
    | From: "Terry Holland" <terryeholland@newsgroup.nospam>
    | Subject: Row Selector Column
    | Date: Wed, 16 Nov 2005 11:25:46 -0000
    | Lines: 113
    | X-Priority: 3
    | X-MSMail-Priority: Normal
    | X-Newsreader: Microsoft Outlook Express 6.00.2800.1506
    | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506
    | Message-ID: <OaeWICq6FHA.2012@TK2MSFTNGP14.phx.gbl>
    | Newsgroups: microsoft.public.dotnet.framework.aspnet.datagridc ontrol
    | NNTP-Posting-Host: host221.multiserv.com 194.200.135.221
    | Path: TK2MSFTNGXA02.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP14.phx.gbl
    | Xref: TK2MSFTNGXA02.phx.gbl
    microsoft.public.dotnet.framework.aspnet.datagridc ontrol:14721
    | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.datagridc ontrol
    |
    | I have created a custom control that dynamically creates a datagrid at
    | runtime. The datagrid is made up of a collection of custom columns. One
    of
    | my custom columns is a Row Selecter column. This comprises a Checkbox for
    | each row and one in the header of datagrid.
    |
    | My row selection is working fine and I am able to loop through the
    selected
    | items in my grid and perform an action on them. What I want to be able to
    | do now is give the user the ability to select or un-select all rows by
    | clicking the checkbox in the header.
    |
    | The trouble that I am experiencing is that the CheckChanged event of the
    | checkbox in the header only fires if the value changes from the value that
    | it is when it is dynamically created.
    |
    | Each postback causes my custom control to be built. When it is built the
    | row selector column (clsDGCCheckBoxColumn) is added and the InitializeCell
    | method adds a checkbox to the header column with the checked value =
    False.
    | When the user checks this control, the SelectColumn method runs
    correctly.
    | If the user unchecks the checkbox in the header, the SelectColumn method
    | does not run. Im assuming that this is because the value of this control
    | when it is built is False and when the user unchecks the control it is
    once
    | again False, therefore the value has not changed therefore the event does
    | not fire.
    |
    | Could someone advise me how to get around this problem - I guess that I
    need
    | to modify InitializeCell so that the value that I set the checkbox to is
    as
    | it was before postback.
    |
    | Thanks
    |
    | Terry Holland
    |
    | ##############################
    | Custom CheckBox Column
    | ##############################
    | Imports System.Web.UI.WebControls
    | Imports System.Web.UI
    | Imports System.ComponentModel
    |
    | Public Class clsDGCCheckBoxColumn
    | Inherits clsCustomDGC_BASE
    |
    | Public Sub New(ByVal objDGC As clsDataGridColumn)
    | MyBase.New(objDGC, "chk")
    | m_clrBackColor = System.Drawing.Color.LightCyan
    | End Sub
    |
    | Public Overrides Sub InitializeCell(ByVal cell As TableCell, ByVal
    | columnIndex As Integer, ByVal itemType As ListItemType)
    | MyBase.InitializeCell(cell, columnIndex, itemType)
    |
    | Select Case itemType
    | Case ListItemType.Header
    | Dim ctl As CheckBox = New CheckBox
    | ctl.AutoPostBack = True
    | ctl.Checked = False
    | cell.Controls.Add(ctl)
    |
    | AddHandler ctl.CheckedChanged, AddressOf SelectColumn
    '(Me,
    | ctl.Checked)
    |
    | Case ListItemType.Item, ListItemType.AlternatingItem,
    | ListItemType.EditItem, ListItemType.SelectedItem
    |
    | Dim ctl As CheckBox = New CheckBox
    | SetControlProperties(cell, ctl)
    |
    | cell.Controls.Add(ctl)
    |
    | AddHandler cell.DataBinding, AddressOf Cell_DataBinding
    | Case Else
    |
    | End Select
    | End Sub
    |
    | Private Sub Cell_DataBinding(ByVal sender As Object, ByVal e As
    | EventArgs)
    | Dim cell As TableCell = sender
    | Dim item As DataGridItem = cell.NamingContainer
    | Dim ctl As CheckBox = item.FindControl(m_strID)
    | Dim pd As PropertyDescriptor =
    | TypeDescriptor.GetProperties(item.DataItem).Find(m _strDataField, True)
    |
    | Try
    | Dim obj1 As Object = pd.GetValue(item.DataItem)
    |
    | ctl.Checked = CType(obj1, Boolean)
    | Catch ex As Exception
    | Throw New Exception("Invalid dataField for custom column
    | clsDGCLabel")
    | End Try
    | End Sub
    |
    |
    |
    | Private Sub SelectColumn(ByVal sender As Object, ByVal e As
    EventArgs) '
    | ByVal booSelect As Boolean)
    | Dim ctlHeader As CheckBox = sender
    | Dim grid As DataGrid = ctlHeader.NamingContainer.NamingContainer
    | Dim booSelect As Boolean = ctlHeader.Checked
    |
    | Dim o As CheckBox
    |
    | For Each dgi As DataGridItem In grid.Items
    | o = dgi.FindControl(m_strID)
    | o.Checked = booSelect
    | Next
    | End Sub
    | End Class
    |
    |
    |
    |
    |

    Steven Cheng[MSFT] Guest

  4. #3

    Default Re: Row Selector Column

    Hi Steven - we meet again :-)

    I guess that client side script is the way to go. This is outside of my
    comfort zone so I had a look through some sample code that you sent to me on
    a previous thread. The code you sent was an example of how to dynamically
    create clientside code on one of my custom columns. I am trying to modify
    this code for use in the Row Selector column. The following code is for a
    custom textbox column (this is the code you sent me and it works fine) and a
    custom checkbox column. I have attempted to add some clientside code using
    the same method that you did in the textbox column ie adding a prerender
    function and adding the code hear

    This is the code that you sent me to detect changes in a textbox column
    ======================================
    Public Class SCTextBoxColumn
    Inherits DataGridColumn

    Private _datafield As String = String.Empty
    Private _txtid As String = "txtValue"

    Public Property DataField() As String
    Get
    Return _datafield
    End Get
    Set(ByVal Value As String)
    _datafield = value
    End Set
    End Property

    Public Property TextBoxID() As String
    Get
    Return _txtid
    End Get
    Set(ByVal Value As String)
    _txtid = value
    End Set
    End Property

    Public Overrides Sub InitializeCell(ByVal cell As TableCell, ByVal
    columnIndex As Integer, ByVal itemType As ListItemType)
    MyBase.InitializeCell(cell, columnIndex, itemType)


    Select Case itemType
    Case ListItemType.Header
    cell.Text = HeaderText


    Case ListItemType.Item, ListItemType.AlternatingItem,
    ListItemType.EditItem, ListItemType.SelectedItem

    Dim txt As TextBox = New TextBox
    txt.ID = _txtid
    cell.Controls.Add(txt)

    'bind prerender handler for textbox
    AddHandler txt.PreRender, AddressOf txt_PreRender

    AddHandler cell.DataBinding, AddressOf Cell_DataBinding

    Case Else


    End Select
    End Sub


    Private Sub Cell_DataBinding(ByVal sender As Object, ByVal e As
    EventArgs)
    Dim cell As TableCell = sender
    Dim item As DataGridItem = cell.NamingContainer
    Dim txt As TextBox = item.FindControl(_txtid)

    Try

    Dim td As PropertyDescriptor
    td =
    TypeDescriptor.GetProperties(item.DataItem).Find(_ datafield, False)


    Dim obj1 As Object = td.GetValue(item.DataItem)
    txt.Text = CType(obj1, String)
    Catch ex As Exception
    Throw New HttpException("Invalid DataField for
    SCTextBoxColumnNot ")
    End Try
    End Sub

    Private Sub txt_PreRender(ByVal source As Object, ByVal e As
    EventArgs)
    Dim txt As TextBox = source

    Dim script As String

    script = "<script language='javascript'>function
    dgtxtcol_onchange(txt){" _
    & "alert(""The textbox's content has been changed to "" +
    txt.value + " _
    & """\r\nWe can add our content formatting here
    now!"");}</script>"


    Dim key As String = "SCTextBoxColumnScript"

    If Not txt.Page.IsClientScriptBlockRegistered(key) Then
    txt.Page.RegisterClientScriptBlock(key, script)
    End If

    txt.Attributes.Add("onchange", "dgtxtcol_onchange(this);")

    End Sub



    End Class
    ==========================

    This works fine. If I put a break on the txt_PreRender function, the code
    jumps into this function each time the control is rendered.
    I am trying to do the same thing for the CheckBox column using the following
    code, but putting a break on the equivalent function for this control
    (cb_PreRender) has no effect. The application never jumps into this
    function.

    ===========================
    Public Class SCCheckBoxColumn
    Inherits DataGridColumn

    Private _datafield As String = String.Empty
    Private _cbid As String = "cbValue"


    Public Property DataField() As String
    Get
    Return _datafield
    End Get
    Set(ByVal Value As String)
    _datafield = value
    End Set
    End Property

    Public Property CheckBoxID() As String
    Get
    Return _cbid
    End Get
    Set(ByVal Value As String)
    _cbid = value
    End Set
    End Property

    Public Overrides Sub InitializeCell(ByVal cell As TableCell, ByVal
    columnIndex As Integer, ByVal itemType As ListItemType)
    MyBase.InitializeCell(cell, columnIndex, itemType)

    Select Case itemType
    Case ListItemType.Header
    Dim cb As CheckBox = New CheckBox
    cb.ID = _cbid
    cell.Controls.Add(cb)

    'FOLLOWING EXAMPLE OF TEXTBOX COLUMN
    AddHandler cb.PreRender, AddressOf cb_PreRender
    Exit Sub

    Case ListItemType.Item, ListItemType.AlternatingItem,
    ListItemType.EditItem, ListItemType.SelectedItem

    Dim cb As CheckBox = New CheckBox
    cb.ID = _cbid
    cell.Controls.Add(cb)

    'FOLLOWING EXAMPLE OF TEXTBOX COLUMN
    AddHandler cb.PreRender, AddressOf cb_PreRender

    AddHandler cell.DataBinding, AddressOf Cell_DataBinding
    Exit Sub

    Case Else

    Exit Sub
    End Select
    End Sub


    'I PUT A BREAK ON THIS FUNCTION BUT APP NEVER STOPS HERE

    Private Sub cb_PreRender(ByVal source As Object, ByVal e As
    EventArgs)
    Dim cb As CheckBox = source

    Dim script As String

    script = "<script language='javascript'>function
    dgcbcol_onclick(cb){" _
    & "alert(""The checkbox value has been changed to "" + cb.value
    + " _
    & """\r\nWe can add our code to respond to checkbox onclick
    event here."");}</script>"


    Dim key As String = "SCTextBoxColumnScript"

    If Not cb.Page.IsClientScriptBlockRegistered(key) Then
    cb.Page.RegisterClientScriptBlock(key, script)
    End If

    cb.Attributes.Add("onclick", "dgcbcol_onclick(this);")

    End Sub

    Public Sub Cell_DataBinding(ByVal sender As Object, ByVal e As
    EventArgs)
    ' no databinding needed
    If _datafield = String.Empty Then
    Return
    End If

    Dim cell As TableCell = sender
    Dim item As DataGridItem = cell.NamingContainer 'as
    DataGridItem
    Dim cb As CheckBox = item.FindControl(_cbid)

    Try

    Dim td As PropertyDescriptor
    td =
    TypeDescriptor.GetProperties(item.DataItem).Find(_ datafield, False)

    Dim obj1 As Object = td.GetValue(item.DataItem)


    cb.Checked = CType(obj1, Boolean)
    Catch ex As Exception
    Throw New HttpException("Invalid DataField for
    SCCheckBoxColumnNot ")
    End Try
    End Sub

    End Class
    ===========================





    "Steven Cheng[MSFT]" <stcheng@online.microsoft.com> wrote in message
    news:DlthMey6FHA.3496@TK2MSFTNGXA02.phx.gbl...
    > Hi Terry,
    >
    > Welcome.
    > Seems you're still on your way developing the custom DataGrid Columns :-).
    > As for the CheckBox postback events problem you mentioned in this post, I
    > think you assumption about the intializing setting on the Header
    > CheckBox.Checked property(as false) is reasonable, and I've also
    > encountered such problems when developing composite control with postback
    > and status changes.. (Such control like CheckBox, TextBox's XXXchanged
    > event is based on the comparation between the control instance's property
    > value and the value retrieved from viewstate....) So have you tried
    > removing the ctl.Checked = False line in the following code to see
    > whether it helps?
    >
    > =============
    > Select Case itemType
    > Case ListItemType.Header
    > Dim ctl As CheckBox = New CheckBox
    > ctl.AutoPostBack = True
    > ctl.Checked = False
    > cell.Controls.Add(ctl)
    > ============
    >
    > Also, as for "checking All", "Unchecking All" functionality, we can also
    > consider use clientside script to make them all complete at clientside
    > without postback...
    >
    > Thanks,
    >
    > Steven Cheng
    > Microsoft Online Support
    >
    > Get Secure! [url]www.microsoft.com/security[/url]
    > (This posting is provided "AS IS", with no warranties, and confers no
    > rights.)
    >
    >
    > --------------------
    > | From: "Terry Holland" <terryeholland@newsgroup.nospam>
    > | Subject: Row Selector Column
    > | Date: Wed, 16 Nov 2005 11:25:46 -0000
    > | Lines: 113
    > | X-Priority: 3
    > | X-MSMail-Priority: Normal
    > | X-Newsreader: Microsoft Outlook Express 6.00.2800.1506
    > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506
    > | Message-ID: <OaeWICq6FHA.2012@TK2MSFTNGP14.phx.gbl>
    > | Newsgroups: microsoft.public.dotnet.framework.aspnet.datagridc ontrol
    > | NNTP-Posting-Host: host221.multiserv.com 194.200.135.221
    > | Path: TK2MSFTNGXA02.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP14.phx.gbl
    > | Xref: TK2MSFTNGXA02.phx.gbl
    > microsoft.public.dotnet.framework.aspnet.datagridc ontrol:14721
    > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.datagridc ontrol
    > |
    > | I have created a custom control that dynamically creates a datagrid at
    > | runtime. The datagrid is made up of a collection of custom columns.
    One
    > of
    > | my custom columns is a Row Selecter column. This comprises a Checkbox
    for
    > | each row and one in the header of datagrid.
    > |
    > | My row selection is working fine and I am able to loop through the
    > selected
    > | items in my grid and perform an action on them. What I want to be able
    to
    > | do now is give the user the ability to select or un-select all rows by
    > | clicking the checkbox in the header.
    > |
    > | The trouble that I am experiencing is that the CheckChanged event of the
    > | checkbox in the header only fires if the value changes from the value
    that
    > | it is when it is dynamically created.
    > |
    > | Each postback causes my custom control to be built. When it is built
    the
    > | row selector column (clsDGCCheckBoxColumn) is added and the
    InitializeCell
    > | method adds a checkbox to the header column with the checked value =
    > False.
    > | When the user checks this control, the SelectColumn method runs
    > correctly.
    > | If the user unchecks the checkbox in the header, the SelectColumn method
    > | does not run. Im assuming that this is because the value of this
    control
    > | when it is built is False and when the user unchecks the control it is
    > once
    > | again False, therefore the value has not changed therefore the event
    does
    > | not fire.
    > |
    > | Could someone advise me how to get around this problem - I guess that I
    > need
    > | to modify InitializeCell so that the value that I set the checkbox to is
    > as
    > | it was before postback.
    > |
    > | Thanks
    > |
    > | Terry Holland
    > |
    > | ##############################
    > | Custom CheckBox Column
    > | ##############################
    > | Imports System.Web.UI.WebControls
    > | Imports System.Web.UI
    > | Imports System.ComponentModel
    > |
    > | Public Class clsDGCCheckBoxColumn
    > | Inherits clsCustomDGC_BASE
    > |
    > | Public Sub New(ByVal objDGC As clsDataGridColumn)
    > | MyBase.New(objDGC, "chk")
    > | m_clrBackColor = System.Drawing.Color.LightCyan
    > | End Sub
    > |
    > | Public Overrides Sub InitializeCell(ByVal cell As TableCell, ByVal
    > | columnIndex As Integer, ByVal itemType As ListItemType)
    > | MyBase.InitializeCell(cell, columnIndex, itemType)
    > |
    > | Select Case itemType
    > | Case ListItemType.Header
    > | Dim ctl As CheckBox = New CheckBox
    > | ctl.AutoPostBack = True
    > | ctl.Checked = False
    > | cell.Controls.Add(ctl)
    > |
    > | AddHandler ctl.CheckedChanged, AddressOf SelectColumn
    > '(Me,
    > | ctl.Checked)
    > |
    > | Case ListItemType.Item, ListItemType.AlternatingItem,
    > | ListItemType.EditItem, ListItemType.SelectedItem
    > |
    > | Dim ctl As CheckBox = New CheckBox
    > | SetControlProperties(cell, ctl)
    > |
    > | cell.Controls.Add(ctl)
    > |
    > | AddHandler cell.DataBinding, AddressOf Cell_DataBinding
    > | Case Else
    > |
    > | End Select
    > | End Sub
    > |
    > | Private Sub Cell_DataBinding(ByVal sender As Object, ByVal e As
    > | EventArgs)
    > | Dim cell As TableCell = sender
    > | Dim item As DataGridItem = cell.NamingContainer
    > | Dim ctl As CheckBox = item.FindControl(m_strID)
    > | Dim pd As PropertyDescriptor =
    > | TypeDescriptor.GetProperties(item.DataItem).Find(m _strDataField, True)
    > |
    > | Try
    > | Dim obj1 As Object = pd.GetValue(item.DataItem)
    > |
    > | ctl.Checked = CType(obj1, Boolean)
    > | Catch ex As Exception
    > | Throw New Exception("Invalid dataField for custom column
    > | clsDGCLabel")
    > | End Try
    > | End Sub
    > |
    > |
    > |
    > | Private Sub SelectColumn(ByVal sender As Object, ByVal e As
    > EventArgs) '
    > | ByVal booSelect As Boolean)
    > | Dim ctlHeader As CheckBox = sender
    > | Dim grid As DataGrid = ctlHeader.NamingContainer.NamingContainer
    > | Dim booSelect As Boolean = ctlHeader.Checked
    > |
    > | Dim o As CheckBox
    > |
    > | For Each dgi As DataGridItem In grid.Items
    > | o = dgi.FindControl(m_strID)
    > | o.Checked = booSelect
    > | Next
    > | End Sub
    > | End Class
    > |
    > |
    > |
    > |
    > |
    >

    Terry Holland Guest

  5. #4

    Default Re: Row Selector Column

    Hi Terry,

    I've just modified my former CheckBox Column example and added a Header
    CheckBox in it which will control All Check and All UnCheck through
    clientside script, here is the code:


    ================================
    Public Class SCCheckBoxColumn
    Inherits DataGridColumn

    Private _datafield As String = String.Empty
    Private _cbid As String = "cbValue"
    Private _gridid = String.Empty


    Public Property DataField() As String
    Get
    Return _datafield
    End Get
    Set(ByVal Value As String)
    _datafield = value
    End Set
    End Property

    Public Property CheckBoxID() As String
    Get
    Return _cbid
    End Get
    Set(ByVal Value As String)
    _cbid = value
    End Set
    End Property

    Public Property DataGridID() As String
    Get
    Return _gridid
    End Get
    Set(ByVal Value As String)
    _gridid = Value
    End Set
    End Property


    Public Overrides Sub InitializeCell(ByVal cell As TableCell, ByVal
    columnIndex As Integer, ByVal itemType As ListItemType)
    MyBase.InitializeCell(cell, columnIndex, itemType)

    Select Case itemType
    Case ListItemType.Header


    Dim cbAll As CheckBox = New CheckBox
    cbAll.ID = "cbAll"
    cbAll.Attributes("onclick") =
    String.Format("chk_onclick(this,'{0}','{1}');", _gridid, _cbid)

    cell.Controls.Add(cbAll)

    AddHandler cell.PreRender, AddressOf cell_PreRender


    Exit Sub

    Case ListItemType.Item, ListItemType.AlternatingItem,
    ListItemType.EditItem, ListItemType.SelectedItem

    Dim cb As CheckBox = New CheckBox
    cb.ID = _cbid
    cell.Controls.Add(cb)
    AddHandler cell.DataBinding, AddressOf Cell_DataBinding
    Exit Sub

    Case Else

    Exit Sub
    End Select
    End Sub


    Public Sub Cell_DataBinding(ByVal sender As Object, ByVal e As
    EventArgs)
    ' no databinding needed
    If _datafield = String.Empty Then
    Return
    End If

    Dim cell As TableCell = sender
    Dim item As DataGridItem = cell.NamingContainer 'as
    DataGridItem
    Dim cb As CheckBox = item.FindControl(_cbid)

    Try

    Dim td As PropertyDescriptor
    td =
    TypeDescriptor.GetProperties(item.DataItem).Find(_ datafield, False)

    Dim obj1 As Object = td.GetValue(item.DataItem)


    cb.Checked = CType(obj1, Boolean)
    Catch ex As Exception
    Throw New HttpException("Invalid DataField for
    SCCheckBoxColumnNot ")
    End Try
    End Sub





    Public Sub cell_PreRender(ByVal source As Object, ByVal e As
    EventArgs)

    Dim cbAll As Control = source


    Dim sb As New System.Text.StringBuilder

    sb.Append("<script language='javascript'>")
    sb.Append("function chk_onclick(span,gdid,cbid){")
    sb.Append("var chks = document.getElementsByTagName('input');")
    sb.Append("var i;")
    sb.Append("for(i=0;i<chks.length;i++){")
    sb.Append("if(chks[i].type == 'checkbox'){")
    sb.Append("var chk = chks[i];")
    sb.Append("if(chk.id.indexOf(gdid) > -1 && chk.id.indexOf(cbid)
    > -1)")
    sb.Append("{chk.checked = span.checked;}}}}")
    sb.Append("</script>")



    cbAll.Page.RegisterStartupScript(cbAll.UniqueID &
    "CheckAllScript", sb.ToString())


    End Sub
    End Class
    ==========================


    # Notice that we need to specify the DataGridID besides the
    CheckBoxID(DataGridID should be idential to the checkBoxColumn's Container
    DataGrid's ID) , here is a example code snippet of dynamically adding such
    as column:

    ===================
    Dim cc1 As SCCheckBoxColumn = New SCCheckBoxColumn
    cc1.HeaderText = "Selected"
    cc1.CheckBoxID = "cbSelected"
    cc1.DataGridID = dgCustom.ID

    dgCustom.Columns.Add(cc1)
    ================================

    BTW, I've also tested the postback means, and that also worked. As long as
    we do not manually set initial value for the Header CheckBox, it's
    CheckedChanged event will fire correctly.

    Hope helps. Thanks,

    Steven Cheng
    Microsoft Online Support

    Get Secure! [url]www.microsoft.com/security[/url]
    (This posting is provided "AS IS", with no warranties, and confers no
    rights.)

    --------------------
    | From: "Terry Holland" <terryeholland@newsgroup.nospam>
    | References: <OaeWICq6FHA.2012@TK2MSFTNGP14.phx.gbl>
    <DlthMey6FHA.3496@TK2MSFTNGXA02.phx.gbl>
    | Subject: Re: Row Selector Column
    | Date: Thu, 17 Nov 2005 10:56:53 -0000
    | Lines: 435
    | X-Priority: 3
    | X-MSMail-Priority: Normal
    | X-Newsreader: Microsoft Outlook Express 6.00.2800.1506
    | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506
    | Message-ID: <#T3SlW26FHA.3132@TK2MSFTNGP10.phx.gbl>
    | Newsgroups: microsoft.public.dotnet.framework.aspnet.datagridc ontrol
    | NNTP-Posting-Host: host200.multiserv.com 194.200.135.200
    | Path: TK2MSFTNGXA02.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP10.phx.gbl
    | Xref: TK2MSFTNGXA02.phx.gbl
    microsoft.public.dotnet.framework.aspnet.datagridc ontrol:14733
    | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.datagridc ontrol
    |
    | Hi Steven - we meet again :-)
    |
    | I guess that client side script is the way to go. This is outside of my
    | comfort zone so I had a look through some sample code that you sent to me
    on
    | a previous thread. The code you sent was an example of how to dynamically
    | create clientside code on one of my custom columns. I am trying to modify
    | this code for use in the Row Selector column. The following code is for a
    | custom textbox column (this is the code you sent me and it works fine)
    and a
    | custom checkbox column. I have attempted to add some clientside code using
    | the same method that you did in the textbox column ie adding a prerender
    | function and adding the code hear
    |
    | This is the code that you sent me to detect changes in a textbox column
    | ======================================
    | Public Class SCTextBoxColumn
    | Inherits DataGridColumn
    |
    | Private _datafield As String = String.Empty
    | Private _txtid As String = "txtValue"
    |
    | Public Property DataField() As String
    | Get
    | Return _datafield
    | End Get
    | Set(ByVal Value As String)
    | _datafield = value
    | End Set
    | End Property
    |
    | Public Property TextBoxID() As String
    | Get
    | Return _txtid
    | End Get
    | Set(ByVal Value As String)
    | _txtid = value
    | End Set
    | End Property
    |
    | Public Overrides Sub InitializeCell(ByVal cell As TableCell, ByVal
    | columnIndex As Integer, ByVal itemType As ListItemType)
    | MyBase.InitializeCell(cell, columnIndex, itemType)
    |
    |
    | Select Case itemType
    | Case ListItemType.Header
    | cell.Text = HeaderText
    |
    |
    | Case ListItemType.Item, ListItemType.AlternatingItem,
    | ListItemType.EditItem, ListItemType.SelectedItem
    |
    | Dim txt As TextBox = New TextBox
    | txt.ID = _txtid
    | cell.Controls.Add(txt)
    |
    | 'bind prerender handler for textbox
    | AddHandler txt.PreRender, AddressOf txt_PreRender
    |
    | AddHandler cell.DataBinding, AddressOf
    Cell_DataBinding
    |
    | Case Else
    |
    |
    | End Select
    | End Sub
    |
    |
    | Private Sub Cell_DataBinding(ByVal sender As Object, ByVal e As
    | EventArgs)
    | Dim cell As TableCell = sender
    | Dim item As DataGridItem = cell.NamingContainer
    | Dim txt As TextBox = item.FindControl(_txtid)
    |
    | Try
    |
    | Dim td As PropertyDescriptor
    | td =
    | TypeDescriptor.GetProperties(item.DataItem).Find(_ datafield, False)
    |
    |
    | Dim obj1 As Object = td.GetValue(item.DataItem)
    | txt.Text = CType(obj1, String)
    | Catch ex As Exception
    | Throw New HttpException("Invalid DataField for
    | SCTextBoxColumnNot ")
    | End Try
    | End Sub
    |
    | Private Sub txt_PreRender(ByVal source As Object, ByVal e As
    | EventArgs)
    | Dim txt As TextBox = source
    |
    | Dim script As String
    |
    | script = "<script language='javascript'>function
    | dgtxtcol_onchange(txt){" _
    | & "alert(""The textbox's content has been changed to "" +
    | txt.value + " _
    | & """\r\nWe can add our content formatting here
    | now!"");}</script>"
    |
    |
    | Dim key As String = "SCTextBoxColumnScript"
    |
    | If Not txt.Page.IsClientScriptBlockRegistered(key) Then
    | txt.Page.RegisterClientScriptBlock(key, script)
    | End If
    |
    | txt.Attributes.Add("onchange", "dgtxtcol_onchange(this);")
    |
    | End Sub
    |
    |
    |
    | End Class
    | ==========================
    |
    | This works fine. If I put a break on the txt_PreRender function, the code
    | jumps into this function each time the control is rendered.
    | I am trying to do the same thing for the CheckBox column using the
    following
    | code, but putting a break on the equivalent function for this control
    | (cb_PreRender) has no effect. The application never jumps into this
    | function.
    |
    | ===========================
    | Public Class SCCheckBoxColumn
    | Inherits DataGridColumn
    |
    | Private _datafield As String = String.Empty
    | Private _cbid As String = "cbValue"
    |
    |
    | Public Property DataField() As String
    | Get
    | Return _datafield
    | End Get
    | Set(ByVal Value As String)
    | _datafield = value
    | End Set
    | End Property
    |
    | Public Property CheckBoxID() As String
    | Get
    | Return _cbid
    | End Get
    | Set(ByVal Value As String)
    | _cbid = value
    | End Set
    | End Property
    |
    | Public Overrides Sub InitializeCell(ByVal cell As TableCell, ByVal
    | columnIndex As Integer, ByVal itemType As ListItemType)
    | MyBase.InitializeCell(cell, columnIndex, itemType)
    |
    | Select Case itemType
    | Case ListItemType.Header
    | Dim cb As CheckBox = New CheckBox
    | cb.ID = _cbid
    | cell.Controls.Add(cb)
    |
    | 'FOLLOWING EXAMPLE OF TEXTBOX COLUMN
    | AddHandler cb.PreRender, AddressOf cb_PreRender
    | Exit Sub
    |
    | Case ListItemType.Item, ListItemType.AlternatingItem,
    | ListItemType.EditItem, ListItemType.SelectedItem
    |
    | Dim cb As CheckBox = New CheckBox
    | cb.ID = _cbid
    | cell.Controls.Add(cb)
    |
    | 'FOLLOWING EXAMPLE OF TEXTBOX COLUMN
    | AddHandler cb.PreRender, AddressOf cb_PreRender
    |
    | AddHandler cell.DataBinding, AddressOf
    Cell_DataBinding
    | Exit Sub
    |
    | Case Else
    |
    | Exit Sub
    | End Select
    | End Sub
    |
    |
    | 'I PUT A BREAK ON THIS FUNCTION BUT APP NEVER STOPS HERE
    |
    | Private Sub cb_PreRender(ByVal source As Object, ByVal e As
    | EventArgs)
    | Dim cb As CheckBox = source
    |
    | Dim script As String
    |
    | script = "<script language='javascript'>function
    | dgcbcol_onclick(cb){" _
    | & "alert(""The checkbox value has been changed to "" +
    cb.value
    | + " _
    | & """\r\nWe can add our code to respond to checkbox onclick
    | event here."");}</script>"
    |
    |
    | Dim key As String = "SCTextBoxColumnScript"
    |
    | If Not cb.Page.IsClientScriptBlockRegistered(key) Then
    | cb.Page.RegisterClientScriptBlock(key, script)
    | End If
    |
    | cb.Attributes.Add("onclick", "dgcbcol_onclick(this);")
    |
    | End Sub
    |
    | Public Sub Cell_DataBinding(ByVal sender As Object, ByVal e As
    | EventArgs)
    | ' no databinding needed
    | If _datafield = String.Empty Then
    | Return
    | End If
    |
    | Dim cell As TableCell = sender
    | Dim item As DataGridItem = cell.NamingContainer 'as
    | DataGridItem
    | Dim cb As CheckBox = item.FindControl(_cbid)
    |
    | Try
    |
    | Dim td As PropertyDescriptor
    | td =
    | TypeDescriptor.GetProperties(item.DataItem).Find(_ datafield, False)
    |
    | Dim obj1 As Object = td.GetValue(item.DataItem)
    |
    |
    | cb.Checked = CType(obj1, Boolean)
    | Catch ex As Exception
    | Throw New HttpException("Invalid DataField for
    | SCCheckBoxColumnNot ")
    | End Try
    | End Sub
    |
    | End Class
    | ===========================
    |
    |
    |
    |
    |
    | "Steven Cheng[MSFT]" <stcheng@online.microsoft.com> wrote in message
    | news:DlthMey6FHA.3496@TK2MSFTNGXA02.phx.gbl...
    | > Hi Terry,
    | >
    | > Welcome.
    | > Seems you're still on your way developing the custom DataGrid Columns
    :-).
    | > As for the CheckBox postback events problem you mentioned in this post,
    I
    | > think you assumption about the intializing setting on the Header
    | > CheckBox.Checked property(as false) is reasonable, and I've also
    | > encountered such problems when developing composite control with
    postback
    | > and status changes.. (Such control like CheckBox, TextBox's XXXchanged
    | > event is based on the comparation between the control instance's
    property
    | > value and the value retrieved from viewstate....) So have you tried
    | > removing the ctl.Checked = False line in the following code to see
    | > whether it helps?
    | >
    | > =============
    | > Select Case itemType
    | > Case ListItemType.Header
    | > Dim ctl As CheckBox = New CheckBox
    | > ctl.AutoPostBack = True
    | > ctl.Checked = False
    | > cell.Controls.Add(ctl)
    | > ============
    | >
    | > Also, as for "checking All", "Unchecking All" functionality, we can also
    | > consider use clientside script to make them all complete at clientside
    | > without postback...
    | >
    | > Thanks,
    | >
    | > Steven Cheng
    | > Microsoft Online Support
    | >
    | > Get Secure! [url]www.microsoft.com/security[/url]
    | > (This posting is provided "AS IS", with no warranties, and confers no
    | > rights.)
    | >
    | >
    | > --------------------
    | > | From: "Terry Holland" <terryeholland@newsgroup.nospam>
    | > | Subject: Row Selector Column
    | > | Date: Wed, 16 Nov 2005 11:25:46 -0000
    | > | Lines: 113
    | > | X-Priority: 3
    | > | X-MSMail-Priority: Normal
    | > | X-Newsreader: Microsoft Outlook Express 6.00.2800.1506
    | > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506
    | > | Message-ID: <OaeWICq6FHA.2012@TK2MSFTNGP14.phx.gbl>
    | > | Newsgroups: microsoft.public.dotnet.framework.aspnet.datagridc ontrol
    | > | NNTP-Posting-Host: host221.multiserv.com 194.200.135.221
    | > | Path: TK2MSFTNGXA02.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP14.phx.gbl
    | > | Xref: TK2MSFTNGXA02.phx.gbl
    | > microsoft.public.dotnet.framework.aspnet.datagridc ontrol:14721
    | > | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.datagridc ontrol
    | > |
    | > | I have created a custom control that dynamically creates a datagrid at
    | > | runtime. The datagrid is made up of a collection of custom columns.
    | One
    | > of
    | > | my custom columns is a Row Selecter column. This comprises a Checkbox
    | for
    | > | each row and one in the header of datagrid.
    | > |
    | > | My row selection is working fine and I am able to loop through the
    | > selected
    | > | items in my grid and perform an action on them. What I want to be
    able
    | to
    | > | do now is give the user the ability to select or un-select all rows by
    | > | clicking the checkbox in the header.
    | > |
    | > | The trouble that I am experiencing is that the CheckChanged event of
    the
    | > | checkbox in the header only fires if the value changes from the value
    | that
    | > | it is when it is dynamically created.
    | > |
    | > | Each postback causes my custom control to be built. When it is built
    | the
    | > | row selector column (clsDGCCheckBoxColumn) is added and the
    | InitializeCell
    | > | method adds a checkbox to the header column with the checked value =
    | > False.
    | > | When the user checks this control, the SelectColumn method runs
    | > correctly.
    | > | If the user unchecks the checkbox in the header, the SelectColumn
    method
    | > | does not run. Im assuming that this is because the value of this
    | control
    | > | when it is built is False and when the user unchecks the control it is
    | > once
    | > | again False, therefore the value has not changed therefore the event
    | does
    | > | not fire.
    | > |
    | > | Could someone advise me how to get around this problem - I guess that
    I
    | > need
    | > | to modify InitializeCell so that the value that I set the checkbox to
    is
    | > as
    | > | it was before postback.
    | > |
    | > | Thanks
    | > |
    | > | Terry Holland
    | > |
    | > | ##############################
    | > | Custom CheckBox Column
    | > | ##############################
    | > | Imports System.Web.UI.WebControls
    | > | Imports System.Web.UI
    | > | Imports System.ComponentModel
    | > |
    | > | Public Class clsDGCCheckBoxColumn
    | > | Inherits clsCustomDGC_BASE
    | > |
    | > | Public Sub New(ByVal objDGC As clsDataGridColumn)
    | > | MyBase.New(objDGC, "chk")
    | > | m_clrBackColor = System.Drawing.Color.LightCyan
    | > | End Sub
    | > |
    | > | Public Overrides Sub InitializeCell(ByVal cell As TableCell, ByVal
    | > | columnIndex As Integer, ByVal itemType As ListItemType)
    | > | MyBase.InitializeCell(cell, columnIndex, itemType)
    | > |
    | > | Select Case itemType
    | > | Case ListItemType.Header
    | > | Dim ctl As CheckBox = New CheckBox
    | > | ctl.AutoPostBack = True
    | > | ctl.Checked = False
    | > | cell.Controls.Add(ctl)
    | > |
    | > | AddHandler ctl.CheckedChanged, AddressOf SelectColumn
    | > '(Me,
    | > | ctl.Checked)
    | > |
    | > | Case ListItemType.Item, ListItemType.AlternatingItem,
    | > | ListItemType.EditItem, ListItemType.SelectedItem
    | > |
    | > | Dim ctl As CheckBox = New CheckBox
    | > | SetControlProperties(cell, ctl)
    | > |
    | > | cell.Controls.Add(ctl)
    | > |
    | > | AddHandler cell.DataBinding, AddressOf
    Cell_DataBinding
    | > | Case Else
    | > |
    | > | End Select
    | > | End Sub
    | > |
    | > | Private Sub Cell_DataBinding(ByVal sender As Object, ByVal e As
    | > | EventArgs)
    | > | Dim cell As TableCell = sender
    | > | Dim item As DataGridItem = cell.NamingContainer
    | > | Dim ctl As CheckBox = item.FindControl(m_strID)
    | > | Dim pd As PropertyDescriptor =
    | > | TypeDescriptor.GetProperties(item.DataItem).Find(m _strDataField, True)
    | > |
    | > | Try
    | > | Dim obj1 As Object = pd.GetValue(item.DataItem)
    | > |
    | > | ctl.Checked = CType(obj1, Boolean)
    | > | Catch ex As Exception
    | > | Throw New Exception("Invalid dataField for custom column
    | > | clsDGCLabel")
    | > | End Try
    | > | End Sub
    | > |
    | > |
    | > |
    | > | Private Sub SelectColumn(ByVal sender As Object, ByVal e As
    | > EventArgs) '
    | > | ByVal booSelect As Boolean)
    | > | Dim ctlHeader As CheckBox = sender
    | > | Dim grid As DataGrid =
    ctlHeader.NamingContainer.NamingContainer
    | > | Dim booSelect As Boolean = ctlHeader.Checked
    | > |
    | > | Dim o As CheckBox
    | > |
    | > | For Each dgi As DataGridItem In grid.Items
    | > | o = dgi.FindControl(m_strID)
    | > | o.Checked = booSelect
    | > | Next
    | > | End Sub
    | > | End Class
    | > |
    | > |
    | > |
    | > |
    | > |
    | >
    |
    |
    |

    Steven Cheng[MSFT] Guest

  6. #5

    Default Re: Row Selector Column

    Thanks Steven - once again you have come up trumps.

    I have one question. On the SCTextBoxColumn in you original sample code,
    you had the following line of code in the InitializeCell

    AddHandler txt.PreRender, AddressOf txt_PreRender

    but for the code you just posted for CustomCheckBoxColumn you had the
    following lines

    cbAll.Attributes("onclick") =
    String.Format("chk_onclick(this,'{0}','{1}');", _gridid, _cbid)

    .......

    AddHandler cell.PreRender, AddressOf cell_PreRender

    Why do you tie the pre-render to the TextBox.PreRender for the custom
    textbox control, but to the Cell.PreRender for the CustomCheckBoxColumn? Is
    there a collection of controls that follow the Textbox example and another
    collection that follow the checkbox example?


    Terry Holland


    Terry Holland Guest

  7. #6

    Default Re: Row Selector Column

    Hi Terry,

    Thanks for the followup. As for the
    ==================
    Why do you tie the pre-render to the TextBox.PreRender for the custom
    textbox control, but to the Cell.PreRender for the CustomCheckBoxColumn? Is
    there a collection of controls that follow the Textbox example and another
    collection that follow the checkbox example?
    =================

    actually, there hasn't any particular concerns on which one's PreRender
    event to use. Because what I want to do here is just find a proper
    control's PreRender event to let me reference the container Page so as to
    call the RegisterXXXXScript function. And here, both the Cell or the
    TextBox or CheckBox is ok....... And the most important point is that we
    must use the "PreRender" event since that's the event where we can make
    sure the SubControl in DataGrid's template has been added into the Page's
    control structure...

    Thanks,

    Steven Cheng
    Microsoft Online Support

    Get Secure! [url]www.microsoft.com/security[/url]
    (This posting is provided "AS IS", with no warranties, and confers no
    rights.)


    --------------------
    | From: "Terry Holland" <terryeholland@newsgroup.nospam>
    | References: <OaeWICq6FHA.2012@TK2MSFTNGP14.phx.gbl>
    <DlthMey6FHA.3496@TK2MSFTNGXA02.phx.gbl>
    <#T3SlW26FHA.3132@TK2MSFTNGP10.phx.gbl>
    <YnTXDJB7FHA.2132@TK2MSFTNGXA02.phx.gbl>
    | Subject: Re: Row Selector Column
    | Date: Fri, 18 Nov 2005 11:51:18 -0000
    | Lines: 26
    | X-Priority: 3
    | X-MSMail-Priority: Normal
    | X-Newsreader: Microsoft Outlook Express 6.00.2800.1506
    | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506
    | Message-ID: <eoY3rZD7FHA.3544@TK2MSFTNGP09.phx.gbl>
    | Newsgroups: microsoft.public.dotnet.framework.aspnet.datagridc ontrol
    | NNTP-Posting-Host: host240.multiserv.com 194.200.135.240
    | Path: TK2MSFTNGXA02.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP09.phx.gbl
    | Xref: TK2MSFTNGXA02.phx.gbl
    microsoft.public.dotnet.framework.aspnet.datagridc ontrol:14741
    | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet.datagridc ontrol
    |
    | Thanks Steven - once again you have come up trumps.
    |
    | I have one question. On the SCTextBoxColumn in you original sample code,
    | you had the following line of code in the InitializeCell
    |
    | AddHandler txt.PreRender, AddressOf txt_PreRender
    |
    | but for the code you just posted for CustomCheckBoxColumn you had the
    | following lines
    |
    | cbAll.Attributes("onclick") =
    | String.Format("chk_onclick(this,'{0}','{1}');", _gridid, _cbid)
    |
    | .......
    |
    | AddHandler cell.PreRender, AddressOf cell_PreRender
    |
    | Why do you tie the pre-render to the TextBox.PreRender for the custom
    | textbox control, but to the Cell.PreRender for the CustomCheckBoxColumn?
    Is
    | there a collection of controls that follow the Textbox example and another
    | collection that follow the checkbox example?
    |
    |
    | Terry Holland
    |
    |
    |

    Steven Cheng[MSFT] Guest

Posting Permissions

  • You may not post new threads
  • You may post replies
  • You may not post attachments
  • You may not edit your posts

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139