Thanks!
it works well for static grid. But I also have some dynamically created grids, this example makes 8 renderer calls instead of 4:
<%@ Page Language="C#" %>
<%@ Import Namespace="Button=Ext.Net.Button" %>
<%@ Import Namespace="System.Data" %>
<%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
<script runat="server">
protected void Button1_Click(object sender, DirectEventArgs e)
{
Reconfigure();
}
protected void Reconfigure()
{
var store = this.Store1;
var grid = this.GridPanel1;
// clear
store.Reader.Clear();
grid.SelectionModel.Clear();
grid.ColumnModel.Columns.Clear();
grid.SelectionModel.Add(new RowSelectionModel { SingleSelect = true });
// Reconfigure Store
ArrayReader reader = new ArrayReader();
DataTable dt = GetDataTable(/*postfix*/);
foreach (DataColumn col in dt.Columns)
{
grid.ColumnModel.Columns.Add(new Column
{
ColumnID = col.ColumnName,
Header = col.ColumnName,
DataIndex = col.ColumnName,
});
RecordField field = new RecordField(col.ColumnName)
{ Mapping = col.ColumnName, Type = RecordFieldType.Auto, SortType = SortTypeMethod.AsUCString };
reader.Fields.Add(field);
}
Renderer r = new Renderer();
r.Fn = "renderer";
grid.ColumnModel.Columns.Add(new Column
{
ColumnID = "abcd",
Header = "img",
DataIndex = "abcd",
Renderer = r,
});
store.Reader.Add(reader);
store.DataSource = dt;
store.DataBind();
if (X.IsAjaxRequest)
{
grid.Render();
}
}
private DataTable GetDataTable()
{
System.Data.DataTable dt = new System.Data.DataTable();
dt.Columns.Add() ;
dt.Columns.Add();
dt.Columns.Add();
dt.Rows.Add(new object[] { "International Business Machines", 81.41, DateTime.Now.ToLongTimeString() });
dt.Rows.Add(new object[] { "Johnson & Johnson", 64.72, "9/1 12:00am" });
dt.Rows.Add(new object[] { "JP Morgan & Chase & Co - " + DateTime.Now.ToLongTimeString(), 45.73, "9/1 12:00am" });
dt.Rows.Add(new object[] { "McDonald\"s Corporation", 36.76, "9/1 12:00am" });
return dt;
}
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<ext:ResourcePlaceHolder ID="ResourcePlaceHolder1" runat="server" Mode="ScriptFiles" />
<script type="text/javascript" language="javascript">
Ext.grid.GridView.override({
onDataChange: function () {
this.refresh(true);
this.updateHeaderSortState();
this.syncFocusEl(0);
this.bodyRendered = true; //added
},
afterRender: function () {
if (!this.ds || !this.cm) {
return;
}
if (!this.bodyRendered) { //added
this.mainBody.dom.innerHTML = this.renderBody() || '*';
this.processRows(0, true);
if (this.deferEmptyText !== true) {
this.applyEmptyText();
}
}
this.grid.fireEvent('viewready', this.grid);
this.fireEvent("afterrender", this);
}
});
var Y = 0;
function renderer(val) {
if (lbl != null)
lbl.setText(++Y);
return "renderer runs: " + Y;
}
</script>
</head>
<body>
<ext:ResourceManager ID="ResourceManager1" runat="server" />
<ext:Label runat="server" ID="lbl"/>
<ext:Button ID="Button1" ToolTip="Button"
runat="server"
Text="Reconfigure"
Icon="Accept">
<DirectEvents>
<Click OnEvent="Button1_Click">
<EventMask ShowMask="true" Target="Page" />
</Click>
</DirectEvents>
</ext:Button>
<ext:GridPanel
ID="GridPanel1"
runat="server"
Border="true"
StripeRows="true"
TrackMouseOver="true" Stateful="false"
Width="600"
Height="350">
<Store>
<ext:Store ID="Store1" runat="server" >
<Reader>
<ext:JsonReader>
<Fields>
<ext:RecordField Name="name" />
<ext:RecordField Name="quote" />
</Fields>
</ext:JsonReader>
</Reader>
</ext:Store>
</Store>
<ColumnModel ID="ColumnModel1" runat="server">
<Columns>
<ext:Column Header="Company" DataIndex="name" >
</ext:Column>
</Columns>
</ColumnModel>
</ext:GridPanel>
</body>
</html>