My code binds WebDataGrid to DataTable. The columns and rows are being read from Database to DataTable and columns are being added to WebDataGrid using BoundDataField.
Any row but the last being deleting results in index out of range exception. I can delete only last row without errors.
If I commment m_dictionaryTableGrid.DataBind(); in rowDeleting event, everything works fine.
C# Code:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if (Request.QueryString["dictionaryTableKey"] != null) { //............ m_dictionaryTableItems = m_adapter.GetdictionaryTableItems(new Guid(Request.QueryString["dictionaryTableKey"].ToString())); foreach (DataColumn drColumn in m_dictionaryTableItems.Columns) { var bField = new BoundDataField(true); bField.Key = drColumn.ColumnName; bField.Header.Text = drColumn.ColumnName; bField.DataFieldName = drColumn.ColumnName; m_dictionaryTableGrid.Columns.Add(bField); } } //new translation table else { m_navigator.BannerLabel = GetGlobalResourceObject(AdminResources, "EditdictionaryTableItem_CreatedictionaryTable").ToString(); AddNewdictionaryTable(); } m_dictionaryTableGrid.DataSource = m_dictionaryTableItems; m_dictionaryTableGrid.DataBind(); } else { UpdateDictionaryTableFromDataGrid(); } }
private void UpdateDictionaryTableFromDataGrid() { if (m_dictionaryTableItems == null) { m_dictionaryTableItems = new DataTable(DictionaryTableItems); foreach (GridField item in m_dictionaryTableGrid.Columns) { m_dictionaryTableItems.Columns.Add(item.Header.Text); } foreach (GridRecord item in m_dictionaryTableGrid.Rows) { DataRow dr = m_dictionaryTableItems.NewRow(); for (int index = 0; index < m_dictionaryTableGrid.Columns.Count; index++) { dr[index] = item.Items[index].Text; } m_dictionaryTableItems.Rows.Add(dr); } } }
protected void m_dictionaryTableGrid_RowsDeleting(object sender, Infragistics.Web.UI.GridControls.RowDeletingEventArgs e) { m_resultsBox.Text = string.Empty; if (m_dictionaryTableItems.Rows.Count <= 1) { m_resultsBox.Text = GetGlobalResourceObject(AdminResources, "EditdictionaryTableItem_TableShouldHaveAtleastOneRow").ToString(); return; } else { m_dictionaryTableItems.Rows[e.Row.Index].Delete(); m_dictionaryTableGrid.DataSource = m_dictionaryTableItems; m_dictionaryTableGrid.DataBind(); m_dictionaryTableGrid.RequestFullAsyncRender(); } }
Css:
<ig:WebDataGrid ID="m_translationTableGrid" runat="server" Height="200px" Width="100%" AutoGenerateColumns="False" AltItemCssClass="WebDataGridAlternateItem" EnableDataViewState="true" CssClass="DataGrid" HeaderCaptionCssClass="WebDataGridHeader" ItemCssClass="WebDataGridItem" BorderStyle='Solid' Font-Names='Verdana' Font-Size="8pt" BorderColor="Black" BorderWidth="1px" EnableAjax="False" onrowadding="m_translationTableGrid_RowAdding" onrowsdeleting="m_translationTableGrid_RowsDeleting" onrowupdating="m_translationTableGrid_RowUpdating" <Behaviors> <ig:Activation Enabled="True"></ig:Activation> <ig:ColumnResizing Enabled="true" /> <ig:EditingCore AutoCRUD="False"> <EditingClientEvents RowsDeleting="m_deletingRow_EventHandler"> </EditingClientEvents> <Behaviors> <ig:CellEditing Enabled="true"> <EditModeActions EnableF2="false" EnableOnActive="true" MouseClick="Single" EnableOnKeyPress="false" /> </ig:CellEditing> <ig:RowAdding Alignment="bottom" AddNewRowCssClass="WebDataGridAddNewItem" EditCellCssClass="WebDataGridAddNewItem" AddNewRowSelectorImageCssClass="WebDataGridAddNewRowSelectorImage"> <EditModeActions EnableF2="false" EnableOnActive="true" MouseClick="Single" /> </ig:RowAdding> <ig:RowDeleting /> </Behaviors> </ig:EditingCore> <ig:Selection CellClickAction="Row" RowSelectType="Multiple" ColumnSelectType="Single" SelectedCellCssClass="DataGridSelectedItem" SelectedRowSelectorCssClass="WebDataGridActiveRowSelectorImage"> <SelectionClientEvents ColumnSelectionChanged="m_dictionaryTableGrid_ColumnSelectionChanged" /> </ig:Selection> <ig:RowSelectors RowNumbering="True" Enabled="true" RowSelectorCssClass="WebDataGridRowSelector" HeaderRowSelectorCssClass="WebDataGridHeader"/> </Behaviors> <EditorProviders> <ig:TextEditorProvider ID="wdg_TextEditor"></ig:TextEditorProvider> </EditorProviders> </ig:WebDataGrid>
Hello Vijay,
After investigating this further, I determined that the exception has been thrown because the current row has been deleted form the database but not from the grid collection. What I can suggest is disabling the dataViewState property of the grid, setting dataKeyFields and binding the data to the grid on every postback.
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
. . .
}
dataSource = GetDataSource();
m_dictionaryTableGrid.DataSource = GetDataSource();
m_dictionaryTableGrid.DataBind();
m_dictionaryTableGrid.DataKeyFields = "ID";
And the deleteRows method could look as the following:
protected void m_dictionaryTableGrid_RowsDeleting(object sender, RowDeletingEventArgs e)
dataSource.Rows[e.Row.Index].Delete();
m_dictionaryTableGrid.Rows.Clear();
m_dictionaryTableGrid.ClearDataSource();
m_dictionaryTableGrid.DataSource = dataSource;
m_dictionaryTableGrid.RequestFullAsyncRender();
Below I am attaching a sample, demonstrating the described behavior. Please test it on your side and let me know if you need any further information regarding this matter.
Regards, Monika Kirkova, Infragistics
0020.WebDataGridDeleteRows.zip