We use cookies to give you the best experience on our website. If you continue to browse, then you agree to our privacy policy and cookie policy. Image for the cookie policy date

Error after update sfDataGrid

Hi,
I have a problem with the update of the sfDataGrid Control.
I fill the sfDataGrid with a DataSet Table which comes from a SQLiteDataAdapter and has a relation to two SQLite tables.

as an example:

public static DataTable LoadAnfordungsDetails()
        {
            DataSet ds = new DataSet();
            using (SQLiteConnection con = new SQLiteConnection(SQLDataConnection.LoadConnectionString()))
            {
                con.Open();
                SQLiteDataAdapter mitarbeiter = new SQLiteDataAdapter("SELECT * FROM tblMitarbeiter;", con);
                mitarbeiter.Fill(ds, "Mitarbeiter");
            }
            using (SQLiteConnection cnn = new SQLiteConnection(SQLDataConnection.LoadConnectionString()))
            {
                cnn.Open();
                SQLiteDataAdapter details = new SQLiteDataAdapter("SELECT tblMitarbeiter.ID AS ID, tblAnforderungen.Name,tblAnforderungen.Klasse,tblAnforderungen.Beschreibung FROM tblKonfigDetails LEFT JOIN tblAnforderungen ON tblAnforderungen.ID = tblKonfigDetails.AnforderungID LEFT JOIN tblMitarbeiter ON tblMitarbeiter.ID = tblKonfigDetails.MitarbeiterID;", cnn);
                details.Fill(ds, "Details");
            }
            ds.Relations.Add(new DataRelation("KonfigDetails", ds.Tables[0].Columns["ID"], ds.Tables[1].Columns["ID"]));
            if(ds.Tables.Count > 0)
            {
                return ds.Tables[0];
            }
            else
            {
                return null;
            }

        }
I fill the sfDataGrid in the constructor of the form. It all works great too.
But when did changed data I try to make an update to the sfDataGrid with:

                 sfDataGrid1.View.BeginInit();
                sfDataGrid1.DataSource = null;
                sfDataGrid1.ClearGrouping();
                sfDataGrid1.ClearSorting();
                sfDataGrid1.ClearFilters();
                sfDataGrid1.TableSummaryRows.Clear();
                sfDataGrid1.GroupSummaryRows.Clear();
                FillGridView(false);
                sfDataGrid1.View.EndInit();
                sfDataGrid1.View.Refresh();

This works so far, but as soon as I switch to the sfDataGrid I get in Program.cs -> Application.Run (new FrmMain ()); an exception.
System.ArgumentException: "An item with the same key has already been added."

System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Unbehandelte Ausnahme</Description><AppDomain>USG Support Agent.exe</AppDomain><Exception><ExceptionType>System.ArgumentException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt.</Message><StackTrace>   bei System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   bei System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   bei Syncfusion.WinForms.DataGrid.DetailsViewHelper.HasChildSource(TableControl tableControl, Int32 rowIndex, RecordEntry record, Dictionary`2&amp;amp; detailsViewDataSource)
   bei Syncfusion.WinForms.DataGrid.Renderers.DetailsViewExpanderCellRenderer.OnRender(Graphics paint, Rectangle cellRect, String cellValue, CellStyleInfo style, DataColumnBase column, RowColumnIndex rowColumnIndex)
   bei Syncfusion.WinForms.DataGrid.Renderers.GridCellRendererBase.Render(Graphics paint, Rectangle cellRect, String cellValue, CellStyleInfo style, DataColumnBase column, RowColumnIndex rowColumnIndex)
   bei Syncfusion.WinForms.DataGrid.GridPainter.DrawCell(Graphics graphics, Rectangle rect, DataColumnBase column, Object cellValue, String formattedText)
   bei Syncfusion.WinForms.DataGrid.GridPainter.DrawColumn(Graphics graphics, Rectangle finalSize, DataRowBase dataRow, IEnumerable`1 columns)
.......even more information 

An exception "System.ArgumentException" error has occurred in mscorlib.dll.
An item with the same key has already been added.
So i hope i describe the exception well and you can help me.

Greeting 
Peschke

3 Replies

MA Mohanram Anbukkarasu Syncfusion Team November 29, 2019 01:05 PM UTC

Hi Patrick, 

Thanks for contacting Syncfusion support. 

The reported crash will occur when more than one DetailsViewDefinitions with same RelationalColumn are added to the DataGrid. From the provided code snippet we suspect that within the method FillGridView(false)  you have added DetailsViewDefinition again for the DataGrid with same relational column which is added before. If yes, please clear the DetailsViewDefinition before adding it again as shown in the following code example. 

Code example :  

this.sfDataGrid1.DetailsViewDefinitions.Clear(); 
 
GridViewDefinition orderDetailsView = new GridViewDefinition(); 
orderDetailsView.RelationalColumn = "OrderDetails"; 
orderDetailsView.DataGrid = childGrid; 
this.sfDataGrid1.DetailsViewDefinitions.Add(orderDetailsView); 

If you are not adding the DetailsViewDefinition with same name within the FillGridView method, Please provide the code used within the FillGridView method and more details about updating the SfDataGrid. It will be helpful for us to find the exact cause for the issue and to provide a  prompt solution at the earliest.  

Regards, 
Mohanram A. 



PA Patrick November 29, 2019 06:03 PM UTC

Hi,
Thanks for the answer.
yes, I made a mistake. I just did not see that I called the DetailView on the new load again.
I think that it is solved.

But I have one more question please.
I try to adjust the line height in the DetailView automatically to the content. I used the example:

Add this to the constructor of the form...
List<string> excludeColumns = new List<string>() { "ID", "Name","Klasse" };
autoFitOptions.ExcludeColumns = excludeColumns;

Add this to the constructor of the form... 
DetailView.DataGrid.QueryRowHeight += sfDataGrid_QueryRowHeight;  <------ Where must the event be inserted that it is fired

Add this to the DetailViewLoading method !
DataView.DataGrid.RowHeight = autoHeight;

void sfDataGrid_QueryRowHeight(object sender, QueryRowHeightEventArgs e)
{
    if (this.sfDataGrid.AutoSizeController.GetAutoRowHeight(e.RowIndex, autoFitOptions, out autoHeight))
    {
        if (autoHeight > 24)
        {
            e.Height = autoHeight;
            e.Handled = true;
        }
    }
}
Sorry for the simple question, but my experience is not that great yet.


MA Mohanram Anbukkarasu Syncfusion Team December 2, 2019 12:55 PM UTC

Hi Patrick, 

Thanks for the update. 

It is not possible to achieve this requirement. Master-Details view doesn’t support auto row height in SfDataGrid. Please find the limitations of the Master-Details view from the following link.  


Please let us know if you require further other assistance from us.  

Regards, 
Mohanram A. 



Loader.
Up arrow icon