This is a migrated thread and some comments may be shown as answers.

Problem with custom column an

4 Answers 59 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Francis
Top achievements
Rank 1
Francis asked on 26 Sep 2012, 12:27 PM
Hi,

I have a custom column (who's inheriting from GridBoundColumn) who display an image related to the DataField. I override the method InitializeCell :

public override void InitializeCell(TableCell cell, int columnIndex, GridItem inItem)

when the page load for the first time, the parameter inItem.DataItem is not null and contains the object representing a row from the DataSource.

On the other side, in the PostBack, inItem.DataItem is null ! So I can't retrieve my data...

Is something wrong ?


Thank you !

4 Answers, 1 is accepted

Sort by
0
Kostadin
Telerik team
answered on 29 Sep 2012, 11:06 AM
Hello Francis,

Based on the provided information it is hard to say what is causing the described issue on your side. Could you please post your aspx markup code with the related code behind file in order to provide you more to the point answer.

All the best,
Kostadin
the Telerik team
If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
0
Francis
Top achievements
Rank 1
answered on 02 Oct 2012, 06:15 AM
Ok, here is the code of my custom column :
public class ConvertedBoolColumn : GridBoundColumn
{
    public override void InitializeCell(TableCell cell, int columnIndex, GridItem inItem)
    {
        if (inItem is GridDataItem)
        {
            if (cell.IsNotNull() && cell.Controls.Count > 0)
            {
                cell.Controls.Clear();
            }
            cell.Text = "";
            GridDataItem item = inItem as GridDataItem;
            if (item.IsNotNull())
            {
                System.Web.UI.WebControls.CheckBox newCheck = new System.Web.UI.WebControls.CheckBox();
                newCheck.Visible = true;
                newCheck.Enabled = false;
                newCheck.Checked = false;
                 if (item.DataItem.IsNotNull())
                {
                    string value = (string)item.DataItem.GetValue(DataField);
                    newCheck.Checked = (value == "O");
                    cell.Controls.Add(newCheck);
                }
            }
        }
        else
        {
            base.InitializeCell(cell, columnIndex, inItem);
        }
    }
}

A fragment of my aspx page :
<ceg:Grid ID="grdEleves" CssClass="LargeGridClass" runat="server"
    OnNeedDataSource="grdEleves_NeedDataSource" OnItemCommand="grdEleve_ItemCommand"
    EnableExcelExport="true" EnableCsvExport="true">
    <MasterTableView DataKeyNames="NumeroEleve,Ecole,Formation,Version,Annee,AnneeScolaire,NumIns">
        <Columns>
            <telerik:GridBoundColumn UniqueName="NumeroEleve" FilterControlAltText="[[[grille.preTexteAlt]]] [[[attr.Eleve.NumEleve]]]"
                DataField="NumeroEleve" HeaderText="[[[attr.Eleve.NumEleve]]]" SortExpression="NumeroEleve"
                HeaderStyle-Width="100px" DataType="System.Int64">
            </telerik:GridBoundColumn>
            <ceg:ConvertedBoolColumn DataField="Definitif" HeaderText="[[[attr.InscriptionEcole.Definitif]]]"
                AllowFiltering="true" SortExpression="Definitif" UniqueName="Definitif" HeaderStyle-Width="65px">
            </ceg:ConvertedBoolColumn>
            <telerik:GridBoundColumn DataField="Annee" FilterControlAltText="[[[grille.preTexteAlt]]] [[[entite.DicDegre]]]"
                HeaderText="[[[entite.DicDegre]]]" SortExpression="Annee" UniqueName="Annee"
                FilterControlWidth="100%" DataFormatString="<nobr>{0}</nobr>" HeaderStyle-Width="50px">
            </telerik:GridBoundColumn>
        </Columns>
    </MasterTableView>
</ceg:Grid>

And a fragment of the code-behind (juste the NeedDataSource event -  I don't know if this piece of ocde) :
protected void grdEleves_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
{
    InscriptionEcoleSearchCriteria criteres = this.grdEleves.GetCriteria<InscriptionEcoleSearchCriteria>();
 
    SearchResultList<InscriptionEcoleSearch> result = GestionInscriptionsHelper.Service.SearchInscriptionEcolesPourEcoleCentreAnneeAvecCriteres(
                        ecole,
                        centre,
                        annee,
                        criteres,
                        this.grdEleves.Pagination()
                    );
 
    this.grdEleves.VirtualItemCount = result.Value;
    this.grdEleves.DataSource = result.Results;
}


0
Accepted
Kostadin
Telerik team
answered on 02 Oct 2012, 03:20 PM
Hello Francis,

This is expected behavior as on postback the DataItem is null. The CheckBoxe state is kept in the ViewState and after the postback it is restored from there. To have access to the DataItem when it is needed, you have to hook the cell's DataBinding event and place your logic there.
public class ConvertedBoolColumn : GridBoundColumn
{
    public override void InitializeCell(TableCell cell, int columnIndex, GridItem inItem)
    {
        if (inItem is GridDataItem)
        {
            if (cell != null && cell.Controls.Count > 0)
            {
                cell.Controls.Clear();
            }
            cell.Text = "";
            GridDataItem item = inItem as GridDataItem;
            if (item != null)
            {
                System.Web.UI.WebControls.CheckBox newCheck = new System.Web.UI.WebControls.CheckBox();
                newCheck.Visible = true;
                newCheck.Enabled = false;
                newCheck.Checked = false;
                cell.DataBinding += new EventHandler(cell_DataBinding);
                cell.Controls.Add(newCheck);
            }
        }
        else
        {
            base.InitializeCell(cell, columnIndex, inItem);
        }
    }
 
    void cell_DataBinding(object sender, EventArgs e)
    {
        TableCell cell = sender as TableCell;
        GridDataItem parent = cell.NamingContainer as GridDataItem;
        DataRowView row = parent.DataItem as DataRowView;
        CheckBox rowCheckBox = cell.Controls[0] as CheckBox;
        rowCheckBox.Checked = (bool)(row[this.DataField]);
    }
}

I also prepared a sample based on the provided code and attached it to this thread.

Kind regards,
Kostadin
the Telerik team
If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
0
Francis
Top achievements
Rank 1
answered on 03 Oct 2012, 06:54 AM
Thank you Kostadin !

In my case, in the cell_DataBinding method, the line
DataRowView row = parent.DataItem as DataRowView;

give a null (the parent.DataItem object has the type of the object I give as a DataSource (InscriptionEcoleSearch in my code behind, see my older post).

So I have to use reflexion to find the value, but it works.


Thank you !
Tags
Grid
Asked by
Francis
Top achievements
Rank 1
Answers by
Kostadin
Telerik team
Francis
Top achievements
Rank 1
Share this question
or