I have an issue when trying to get the data grid to rebind after an item has been inserted. One thing to note is that I put all items in edit mode upon load. This is working fine. When I click the Add New command on the grid, I fire the ItemCommand event, add a row to the database, then set the grid Datasource to null and rebind.
The flow should be like this:
Initial Load (works properly):
-RadGrid1_NeedDataSource
- PopulateGrid()
RadGrid1_ItemCreated
- Populate()
- PopulateEntity()
RadGrid1_ItemDataBound
- PopulateDetCodeList()
RadGrid1_PreRender
Click Add New Command:
RadGrid1_ItemCreated
RadGrid1_ItemCommand
- AddNewItem()
- PopulateGrid() (note: allowRebind = true)
//this happens when Rebind() is called in PopulateGrid()
RadGrid1_ItemDataBound
RadGrid1_ItemCreated
- Populate()
- PopulateEntity()
RadGrid1_PreRender
NOTICE That RadGrid1_NeedDataSource() event is not called when Add New Command is fired.
Here is my code:
<telerik:RadGrid ID="RadGrid1" runat="server" EnableEmbeddedSkins="false"
Skin="PayDayUsa" AutoGenerateColumns="false" AutoGenerateEditColumn="False" GridLines="None"
OnNeedDataSource="RadGrid1_NeedDataSource" OnItemCreated="RadGrid1_ItemCreated"
OnItemDataBound="RadGrid1_ItemDataBound" OnItemCommand="RadGrid1_ItemCommand"
AllowPaging="True" AllowSorting="True" AllowMultiRowEdit="true" OnPreRender="RadGrid1_PreRender">
<PagerStyle Mode="NextPrevAndNumeric" />
<MasterTableView CommandItemDisplay="Top" EditMode="InPlace" ExpandCollapseColumn-Display="false">
<Columns>
<telerik:GridTemplateColumn UniqueName="TemplateColumn" HeaderText="Code">
<ItemTemplate>
<asp:Label ID="DetCode" runat="server" Text='<%#Eval("DetCode") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<telerik:RadComboBox ID="DetCode" runat="server">
</telerik:RadComboBox>
</EditItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridTemplateColumn UniqueName="TemplateColumn" HeaderText="Hours">
<ItemTemplate>
<asp:Label ID="Hours" runat="server" Text='<%#Eval("Hours") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<telerik:RadNumericTextBox ID="Hours" runat="server">
</telerik:RadNumericTextBox>
</EditItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridTemplateColumn UniqueName="TemplateColumn" HeaderText="Rate">
<ItemTemplate>
<asp:Label ID="Rate" runat="server" Text='<%#Eval("Rate") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<telerik:RadNumericTextBox ID="Rate" runat="server">
</telerik:RadNumericTextBox>
</EditItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridTemplateColumn UniqueName="TemplateColumn" HeaderText="Amount">
<ItemTemplate>
<asp:Label ID="Amount" runat="server" Text='<%#Eval("Amount") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<telerik:RadNumericTextBox ID="Amount" runat="server">
</telerik:RadNumericTextBox>
</EditItemTemplate>
</telerik:GridTemplateColumn>
</Columns>
</MasterTableView>
<FilterMenu EnableTheming="True">
<CollapseAnimation Type="OutQuint" Duration="200"></CollapseAnimation>
</FilterMenu>
</telerik:RadGrid>
private void PopulateDetCodeList(GridEditableItem item)
{
//dropdown list in grid
RadComboBox list = (RadComboBox)item["TemplateColumn"].FindControl("DetCode");
list.DataTextField = CDetCodesList.DBFieldName.DataText.ToString();
list.DataValueField = CDetCodesList.DBFieldName.DataValue.ToString();
list.DataSource = CDetCodesList.GetList();
list.DataBind();
}
private void PopulateGrid(bool allowRebind)
{
this.MyDatabaseData = null;
RadGrid1.DataSource = null;
if (allowRebind)
{
this.IsLoaded = false;
RadGrid1.Rebind();
return;
}
else
{
this.IsLoaded = true;
RadGrid1.DataSource = MyDatabaseData;
RadGrid1.MasterTableView.DataKeyNames = new string[] { MyEntity.DBFieldName.Guidfield.ToString() };
}
}
/// <summary>
/// Populates the editable items in the row
/// </summary>
/// <param name="item"></param>
private void Populate(GridEditableItem item)
{
if (item.ItemIndex < 0)
{
//inserting item so do not populate
return;
}
MyEntity entity = PopulateEntity(item);
//populates the editable items (grid)
PopulateUIFromEntity(entity, item);
}
/// <summary>
/// Populates the entity from the database (locally cached)
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
private MyEntity PopulateEntity(GridEditableItem item)
{
if (item.ItemIndex < 0)
{
//inserting item so do not populate
return new MyEntity();
}
//retrieves entity data from database
string uniqueKey = item.OwnerTableView.DataKeyValues[item.ItemIndex][MyEntity.DBFieldName.Guidfield.ToString()].ToString();
MyEntity entity = MyEntity.GetByPrimaryKey(uniqueKey);
return entity;
}
private bool AddNewItem()
{
int rowCount = this.MyDatabaseData.Rows.Count;
//get required data from first row
MyEntity originalEntity = MyEntity.DataBind(this.MyDatabaseData.Rows[0]);
MyEntity entity = new MyEntity();
entity.Trans = originalEntity.Trans;
entity.SubTrans = Convert.ToString(rowCount + 1);
bool success = entity.SaveData();
return success;
}
#region Form Events
protected void Page_Load(object sender, EventArgs e)
{
}
protected void RadGrid1_NeedDataSource(object source, Telerik.Web.UI.GridNeedDataSourceEventArgs e)
{
if (!this.IsLoaded)
{
PopulateGrid(false);
}
}
protected void RadGrid1_ItemCreated(object sender, GridItemEventArgs e)
{
if (e.Item is GridEditableItem && e.Item.IsInEditMode)
{
//Populates dropdown list
PopulateDetCodeList((GridEditableItem)e.Item);
}
}
protected void RadGrid1_ItemDataBound(object sender, GridItemEventArgs e)
{
if (e.Item is GridEditableItem && e.Item.IsInEditMode)
{
//Populates row data
Populate((GridEditableItem)e.Item);
}
}
protected void RadGrid1_ItemCommand(object source, GridCommandEventArgs e)
{
switch (e.CommandName.ToLower())
{
case "initinsert":
case "performinsert":
//add new row in database
ControlBase.EditSuccessful = this.AddNewItem();
break;
case "edit":
ControlBase.EditSuccessful = false;
break;
case "update":
//e.Canceled = !UpdateItem((GridDataItem)e.Item);
break;
case "cancel":
break;
}
}
protected void RadGrid1_PreRender(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
foreach (GridItem item in RadGrid1.MasterTableView.Items)
{
if (item is GridEditableItem)
{
GridEditableItem editableItem = item as GridDataItem;
editableItem.Edit = true;
}
}
RadGrid1.Rebind();
}
}
protected void SaveButton_Click(object sender, EventArgs e)
{
this.Save();
}
protected void CancelButton_Click(object sender, EventArgs e)
{
}
#endregion