Completed
Last Updated: 02 Jul 2018 09:34 by Dimitar
Use attached to reproduce.

Workaround
- Set the position at runtime. 
   Me.radGridView1.MasterTemplate.AddNewRowPosition = Telerik.WinControls.UI.SystemRowPosition.Bottom
Declined
Last Updated: 29 Jun 2018 13:01 by ADMIN
Use attached to reproduce.

With versions prior 2015.3.930 the results are different.
Declined
Last Updated: 27 Jun 2018 10:14 by ADMIN
I have a GridView (Winforms v. 2017.3.1017.40, same problem with 2017.2.502.40) configured as on the attached screenshot (made some groups, made a search, and used the "excel-like" filter on a column to uncheck some values).

Then I try to click on some column headers to sort the grid.
After a few clicks, I get this error :
InvalidOperationException: La collection a été modifiée ; l'opération d'énumération peut ne pas s'exécuter.

I got different stacktrace with the same error :
InvalidOperationException: La collection a été modifiée ; l'opération d'énumération peut ne pas s'exécuter.
   at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
   at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
   at System.Collections.Generic.List`1.Enumerator.MoveNext()
   at Telerik.WinControls.UI.DataGroup.<GetEnumerator>d__0.MoveNext()
   at Telerik.WinControls.UI.GridViewGroupRowInfo.get_ChildRows()
   at Telerik.WinControls.UI.GridViewRowInfo.HasChildRows()
   at Telerik.WinControls.UI.PrintGridTraverser.CanStepInHierarchy()
   at Telerik.WinControls.UI.GridTraverser.StepInHierarchy()
   at Telerik.WinControls.UI.GridTraverser.MoveNextCore()
   at Telerik.WinControls.UI.GridTraverser.MoveNext()
   at Telerik.WinControls.UI.GridViewSearchRowInfo.worker_DoWork(Object sender, DoWorkEventArgs e)
   at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
   at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)

-----

InvalidOperationException: Failed to compare two elements in the array. ---> NullReferenceException: Object reference not set to an instance of an object.
   at Telerik.WinControls.UI.GridViewRowInfoComparer.CompareRows(GridViewRowInfo x, GridViewRowInfo y, SortDescriptorCollection context)
   at System.Collections.Generic.ArraySortHelper`1.InternalBinarySearch(T[] array, Int32 index, Int32 length, T value, IComparer`1 comparer)
   at System.Collections.Generic.ArraySortHelper`1.BinarySearch(T[] array, Int32 index, Int32 length, T value, IComparer`1 comparer)


   --- End of inner exception stack trace ---
   at System.Collections.Generic.ArraySortHelper`1.BinarySearch(T[] array, Int32 index, Int32 length, T value, IComparer`1 comparer)
   at System.Collections.Generic.List`1.BinarySearch(Int32 index, Int32 count, T item, IComparer`1 comparer)
   at Telerik.Collections.Generic.HybridIndex`1.PerformWithQuickSort()
   at Telerik.Collections.Generic.HybridIndex`1.get_Items()
   at Telerik.Collections.Generic.Index`1.GetEnumerator()
   at Telerik.WinControls.Data.GroupBuilder`1.Perform(IReadOnlyCollection`1 items, Int32 level, Group`1 parent)
   at Telerik.WinControls.Data.GroupBuilder`1.get_Groups()
   at Telerik.WinControls.UI.GridViewInfo.Refresh()
   at Telerik.WinControls.UI.GridViewInfo.get_ChildRows()
   at Telerik.WinControls.UI.ViewInfoTraverser.SetCollectionForStage(Boolean initializeCollection)
   at Telerik.WinControls.UI.ViewInfoTraverser.ChangeCollectionForward()
   at Telerik.WinControls.UI.ViewInfoTraverser.MoveNextCore()
   at Telerik.WinControls.UI.ViewInfoTraverser.MoveNext()
   at Telerik.WinControls.UI.GridTraverser.MoveNextCore()
   at Telerik.WinControls.UI.GridTraverser.MoveNext()
   at Telerik.WinControls.UI.BaseGridNavigator.NavigateToRow(GridViewRowInfo row, Boolean select)
   at Telerik.WinControls.UI.BaseGridNavigator.ProcessViewChangedEvent(GridViewEvent eventData)
   at Telerik.WinControls.UI.BaseGridNavigator.ProcessEventCore(GridViewEvent eventData)
   at Telerik.WinControls.UI.GridViewEventProcessEntity.ProcessCollection(GridViewEvent gridEvent, PriorityWeakReferenceList list, GridEventProcessMode processMode)
   at Telerik.WinControls.UI.GridViewEventProcessEntity.ProcessEvent(GridViewEvent gridEvent)
   at Telerik.WinControls.UI.GridViewSynchronizationService.NotifyListeners(GridViewEvent gridEvent)
   at Telerik.WinControls.UI.GridViewSynchronizationService.FlushEvents()
   at Telerik.WinControls.UI.GridViewSynchronizationService.DispatchEvent(GridViewEvent gridEvent)
   at Telerik.WinControls.UI.GridViewSynchronizationService.DispatchEvent(GridViewTemplate template, GridViewEvent eventData, Boolean postUI)
   at Telerik.WinControls.UI.GridViewTemplate.DispatchDataViewChangedEvent(Object sender, DataViewChangedEventArgs args)
   at Telerik.WinControls.UI.GridViewTemplate.OnViewChanged(Object sender, DataViewChangedEventArgs e)
   at Telerik.WinControls.UI.MasterGridViewTemplate.OnViewChanged(Object sender, DataViewChangedEventArgs e)
   at Telerik.WinControls.Data.RadDataView`1.RebuildData(Boolean notify)
   at Telerik.WinControls.Data.RadDataView`1.OnNotifyPropertyChanged(PropertyChangedEventArgs e)
   at Telerik.WinControls.Data.RadCollectionView`1.OnNotifyPropertyChanged(String propertyName)
   at Telerik.WinControls.UI.GridViewSortDescriptorCollection.OnCollectionChanged(NotifyCollectionChangedEventArgs args)
   at System.ComponentModel.PropertyChangedEventHandler.Invoke(Object sender, PropertyChangedEventArgs e)
   at Telerik.WinControls.Data.SortDescriptor.set_Direction(ListSortDirection value)
   at Telerik.WinControls.UI.GridViewColumn.Sort(RadSortOrder sortOrder, Boolean multiSortMode)
   at Telerik.WinControls.UI.GridHeaderCellElement.Sort(RadSortOrder sortOrder)
   at Telerik.WinControls.UI.GridHeaderRowBehavior.OnMouseUp(MouseEventArgs e)
   at Telerik.WinControls.UI.BaseGridBehavior.OnMouseUp(MouseEventArgs e)
   at Telerik.WinControls.UI.RadGridView.OnMouseUp(MouseEventArgs e)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at Telerik.WinControls.RadControl.WndProc(Message& m)
   at Telerik.WinControls.UI.RadGridView.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

------

InvalidOperationException: Collection was modified; enumeration operation may not execute.
   at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
   at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
   at System.Collections.Generic.List`1.Enumerator.MoveNext()
   at Telerik.WinControls.UI.DataGroup.<GetEnumerator>d__0.MoveNext()
[...]
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Alto.Client.Controls.Dispatch.DispatchResources.DeliveryPointFilterManager.get_DeliveryPointsVisible() in d:\Builds\45153\Alto\Alto.Prod\src\Alto\Alto.Client\Controls\Dispatch\DispatchResources\DeliveryPointFilterManager.cs:line 38
   at Alto.Client.Controls.Dispatch.DispatchResources.UcDeliveryPoint.get_Title() in d:\Builds\45153\Alto\Alto.Prod\src\Alto\Alto.Client\Controls\Dispatch\DispatchResources\UcDeliveryPoint.cs:line 1520
   at Alto.Client.Controls.Dispatch.DispatchResources.UcDeliveryPoint.updatePanelTitle() in d:\Builds\45153\Alto\Alto.Prod\src\Alto\Alto.Client\Controls\Dispatch\DispatchResources\UcDeliveryPoint.cs:line 543
   at Alto.Client.Controls.Dispatch.DispatchResources.UcDeliveryPoint.onFilterChanged(Object sender, GridViewCollectionChangedEventArgs e) in d:\Builds\45153\Alto\Alto.Prod\src\Alto\Alto.Client\Controls\Dispatch\DispatchResources\UcDeliveryPoint.cs:line 547
   at Telerik.WinControls.UI.GridViewCollectionChangedEventHandler.Invoke(Object sender, GridViewCollectionChangedEventArgs e)
   at Telerik.WinControls.UI.RadGridView.OnFilterChanged(Object sender, GridViewCollectionChangedEventArgs e)
   at Telerik.WinControls.UI.EventDispatcher.RaiseEvent[T](Object eventKey, Object sender, T args)
   at Telerik.WinControls.UI.GridViewFilterDescriptorCollection.OnCollectionChanged(NotifyCollectionChangedEventArgs args)
   at Telerik.Collections.Generic.NotifyCollection`1.InsertItem(Int32 index, T item)
   at Telerik.WinControls.UI.GridViewFilterDescriptorCollection.InsertItem(Int32 index, FilterDescriptor item)
   at System.Collections.ObjectModel.Collection`1.Add(T item)
   at Telerik.WinControls.UI.GridViewDataColumn.SetFilterDescriptor(FilterDescriptor value)
   at Telerik.WinControls.UI.GridHeaderCellElement.filterPopup_FilterConfirmed(Object sender, EventArgs e)
   at Telerik.WinControls.UI.BaseFilterPopup.OnFilterConfirmed()
   at Telerik.WinControls.UI.RadListFilterPopup.OnButtonOkClick(EventArgs e)
   at Telerik.WinControls.UI.RadListFilterPopup.ButtonOK_Click(Object sender, EventArgs e)
   at Telerik.WinControls.RadElement.OnClick(EventArgs e)
   at Telerik.WinControls.UI.RadButtonItem.OnClick(EventArgs e)
   at Telerik.WinControls.UI.RadButtonElement.OnClick(EventArgs e)
   at Telerik.WinControls.RadElement.DoClick(EventArgs e)
   at Telerik.WinControls.RadElement.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args)
   at Telerik.WinControls.RadItem.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args)
   at Telerik.WinControls.RadElement.RaiseRoutedEvent(RadElement sender, RoutedEventArgs args)
   at Telerik.WinControls.RadElement.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args)
   at Telerik.WinControls.RadItem.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args)
   at Telerik.WinControls.RadElement.RaiseRoutedEvent(RadElement sender, RoutedEventArgs args)
   at Telerik.WinControls.RadElement.DoMouseUp(MouseEventArgs e)
   at Telerik.WinControls.ComponentInputBehavior.OnMouseUp(MouseEventArgs e)
   at Telerik.WinControls.RadControl.OnMouseUp(MouseEventArgs e)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at Telerik.WinControls.RadControl.WndProc(Message& m)
   at Telerik.WinControls.UI.RadPopupControlBase.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

----

InvalidOperationException: Collection was modified; enumeration operation may not execute.
   at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
   at Telerik.WinControls.UI.DataGroup.<GetEnumerator>d__0.MoveNext()
   at Telerik.WinControls.Data.GroupBuilder`1.Perform(IReadOnlyCollection`1 items, Int32 level, Group`1 parent)
   at Telerik.WinControls.Data.DataItemGroup`1.get_Groups()
   at Telerik.WinControls.UI.DataGroup.get_Groups()
   at Telerik.WinControls.UI.GridViewTemplate.InvalidateSummaryRowsCore(DataGroup group, Boolean invalidateChildren)
   at Telerik.WinControls.UI.GridViewTemplate.InvalidateSummaryRowsCore(DataGroup group, Boolean invalidateChildren)
   at Telerik.WinControls.UI.GridViewTemplate.InvalidateGroupSummaryRows(DataGroup group, Boolean invalidateChildren)
   at Telerik.WinControls.UI.GridViewTemplate.RefreshSummaryRowsInGroup(NotifyCollectionChangedEventArgs e)
   at Telerik.WinControls.UI.GridViewTemplate.RefreshAggregates(NotifyCollectionChangedEventArgs e)
   at Telerik.WinControls.UI.MasterGridViewTemplate.OnViewChanged(Object sender, DataViewChangedEventArgs e)
   at Telerik.WinControls.Data.RadDataView`1.RebuildData(Boolean notify)
   at Telerik.WinControls.Data.RadDataView`1.OnNotifyPropertyChanged(PropertyChangedEventArgs e)
   at Telerik.WinControls.Data.RadCollectionView`1.OnNotifyPropertyChanged(String propertyName)
   at Telerik.WinControls.UI.GridViewSortDescriptorCollection.OnCollectionChanged(NotifyCollectionChangedEventArgs args)
   at Telerik.WinControls.UI.GridViewSortDescriptorCollection.RemoveItem(Int32 index)
   at Telerik.WinControls.UI.GridViewColumn.Sort(RadSortOrder sortOrder, Boolean multiSortMode)
   at Telerik.WinControls.UI.GridHeaderCellElement.Sort(RadSortOrder sortOrder)
   at Telerik.WinControls.UI.GridHeaderRowBehavior.OnMouseUp(MouseEventArgs e)
   at Telerik.WinControls.UI.BaseGridBehavior.OnMouseUp(MouseEventArgs e)
   at Telerik.WinControls.UI.RadGridView.OnMouseUp(MouseEventArgs e)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at Telerik.WinControls.RadControl.WndProc(Message& m)
   at Telerik.WinControls.UI.RadGridView.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Unplanned
Last Updated: 26 Jun 2018 10:00 by ADMIN
To reproduce:
- Create a self reference grid and set the columns width so the horizontal scrollbar is visible. 
- Scroll to the right and filter by the last column,
- Type a single character, the the edited cell is now changed. 

Workaround:
class MyFilterCell : GridFilterCellElement
{
    protected override Type ThemeEffectiveType
    {
        get
        {
            return typeof(GridFilterCellElement);
        }
    }

    public MyFilterCell(GridViewDataColumn column, GridRowElement row) : base(column, row)
    {
        
    }
    public override bool IsCompatible(GridViewColumn data, object context)
    {
        return false;
    }
}

Unplanned
Last Updated: 26 Jun 2018 09:36 by ADMIN
Use attached to reproduce.


Workaround: 

this.LoadFieldList(hiddenGrid.MasterTemplate);
this.FieldList.Add(new Telerik.Data.Expressions.ExpressionItem()
{ Name = "Test", Description = "Test", Syntax = "Test", Type = Telerik.Data.Expressions.ExpressionItemType.Field, Value = "Test" });

Unplanned
Last Updated: 26 Jun 2018 09:31 by ADMIN
Use attached to reproduce.
- Use a 125% and 150% monitor for reproducing.
- This should be tested on Windows 10 1803 (Spring Update) as well.

Workaround:
private void RadGridView1_ColumnChooserCreated(object sender, Telerik.WinControls.UI.ColumnChooserCreatedEventArgs e)
{
    e.ColumnChooser = new MyColumnChooser(this.radGridView1.MasterTemplate, radGridView1.GridViewElement);
}

public partial class MyColumnChooser : GridViewColumnChooser
{
    public MyColumnChooser()
    {
        InitializeComponent();
    }
    public MyColumnChooser(GridViewTemplate template, RadGridViewElement rootElement) : base(template, rootElement)
    {
    }
    SizeF oldDpi = new SizeF(1, 1);
    protected override void HandleDpiChanged()
    {

        base.HandleDpiChanged();
        SizeF descale = new SizeF(1f / this.FormElement.DpiScaleFactor.Width, 1f / this.FormElement.DpiScaleFactor.Height);
        this.Scale(descale);
        var dpi = NativeMethods.GetMonitorDpi(Screen.FromRectangle(this.Bounds), NativeMethods.DpiType.Effective);
        if (oldDpi != dpi)
        {
            SizeF sz = new SizeF(dpi.Width / oldDpi.Width, dpi.Height / oldDpi.Height);
       
            this.Scale(dpi);
        }

        oldDpi = dpi;
    }
   
}
Unplanned
Last Updated: 26 Jun 2018 08:20 by ADMIN

Please refer to the attached sample project and follow the steps illustrated in the gif file. Note: the same behavior is observed with the CellValidating event in the new row. Workaround: use the RowValidating event instead: private void radGridView1_RowValidating(object sender, Telerik.WinControls.UI.RowValidatingEventArgs e) { if (e.Row is Telerik.WinControls.UI.GridViewNewRowInfo && e.Row.Cells["Id"].Value == null) { this.radGridView1.MasterView.TableAddNewRow.CancelAddNewRow(); this.radGridView1.CurrentRow = this.radGridView1.MasterView.TableAddNewRow; } }

 

NOTE: The CellValidating event is fired multiple times as well when you select a new tab in RadDock. There is a second project attached.

Completed
Last Updated: 25 Jun 2018 10:13 by ADMIN
A similar issue can be also observed in RadTreeView:

Workaround RadGridView: 
private void RadGridView1_CellEditorInitialized(object sender, GridViewCellEventArgs e)
{
    RadTextBoxEditor editor = e.ActiveEditor as RadTextBoxEditor;
    if (editor != null)
    {
        editor.EditorElement.MinSize = new Size(0, 30);
    }
}

Workaround RadTreeView:
 
private void RadTreeView1_EditorInitialized(object sender, TreeNodeEditorInitializedEventArgs e)
{
    TreeViewTextBoxEditor editor = e.Editor as TreeViewTextBoxEditor;
    if (editor != null)
    {
        ((BaseTextBoxEditorElement)editor.EditorElement).TextBoxItem.TextBoxControl.MinimumSize = new Size(0, 24);
    }
}

In 125% the RadTextBox in the Fluent theme keeps shrinking:

Workaround
public RadForm1()
{
    InitializeComponent();

    SizeF dpi = NativeMethods.GetMonitorDpi(Screen.PrimaryScreen, NativeMethods.DpiType.Effective);
    this.radTextBox1.MinimumSize = new Size(0, (int)(24 * dpi.Height));
}


Completed
Last Updated: 21 Jun 2018 14:40 by ADMIN
Use attached to reproduce.

Workaround:
private void RadGridView1_ColumnChooserCreated(object sender, Telerik.WinControls.UI.ColumnChooserCreatedEventArgs e)
{
    var columnChooser = e.ColumnChooser as GridViewColumnChooser;
    columnChooser.Shown -= ColumnChooser_Shown;
    columnChooser.Shown += ColumnChooser_Shown;
  
}

private void ColumnChooser_Shown(object sender, EventArgs e)
{
    var columnChooser = sender as GridViewColumnChooser;
    var factor = this.FormElement.DpiScaleFactor;
    columnChooser.Scale(factor);
}
Completed
Last Updated: 21 Jun 2018 14:40 by ADMIN
Use attached to reproduce.

Workaround:

Use CellFormatting instead of RowFormating. 
Unplanned
Last Updated: 21 Jun 2018 14:39 by ADMIN
To reproduce:
private void radButton1_Click(object sender, EventArgs e)
{
    radGridView1.MasterView.TableSearchRow.SelectNextSearchResult();

}
Check the index in the search textbox, it is not updated. 

Workaround:
var cell = radGridView1.TableElement.FindDescendant<GridSearchCellElement>();
if (cell != null)
{
    cell.FindNextButton.PerformClick();
}
Completed
Last Updated: 21 Jun 2018 14:39 by ADMIN
Completed
Last Updated: 21 Jun 2018 14:11 by ADMIN
To reproduce:
Use the following code
private void RadGridView1_UserAddingRow(object sender, GridViewRowCancelEventArgs e)
{
    radGridView1.MasterView.TableAddNewRow.CancelAddNewRow();
    radGridView1.MasterView.ViewTemplate.DataView.CurrentItem.IsCurrent = false;
}

Place the new row at the bottom. While in edit mode press tab to fill until an exception is thrown.

Workaround:
BaseGridBehavior gridBehavior = radGridView1.GridBehavior as BaseGridBehavior;
gridBehavior.UnregisterBehavior(typeof(GridViewNewRowInfo));
gridBehavior.RegisterBehavior(typeof(GridViewNewRowInfo), new CustomGridRowBehavior());


internal class CustomGridRowBehavior : GridNewRowBehavior
{
    protected override bool ProcessTabKey(KeyEventArgs keys)
    {
        bool newRowIsInEditMode = this.IsInEditMode && this.GridViewElement.CurrentRow is GridViewNewRowInfo;

        if ( newRowIsInEditMode  && this.GridViewElement.Navigator.IsLastEditableColumn(this.GridViewElement.CurrentColumn))              
        {
            this.GridViewElement.Navigator.SelectFirstColumn();

            while (this.GridViewElement.CurrentColumn.ReadOnly && this.GridViewElement.Navigator.SelectNextColumn())
            { }
            return false;
        }
        return base.ProcessTabKey(keys);
    }
}
Completed
Last Updated: 21 Jun 2018 14:11 by ADMIN
Use attached to reproduce.

Workaround:

DragDropService.AllowAutoScrollColumnsWhileDragging = false;
DragDropService.AllowAutoScrollRowsWhileDragging = false;
Completed
Last Updated: 21 Jun 2018 13:59 by ADMIN
To reproduce: add a grid and a button and use the following code snippet:

[WORKAROUND: call Application.DoEvent at the beginning of the BindGrid method before rebinding]

   public partial class Form1 : Form
    {
        DataTable dtLeg;
        DataTable dtComp;
        DataTable dtClass;
        Int32 intClickCount = 0;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                BindTables();
            }
            catch(Exception)
            {
                throw;
            }


        }

        private void BindTables()
        {
            try
            {
                dtLeg = new DataTable();
                dtComp = new DataTable();
                dtClass = new DataTable();

                Random rand1 = new Random();
                Random rand2 = new Random();
                Random rand3 = new Random();
                Random rand4 = new Random();

                int cNo = rand1.Next(2000, 10000);
                int dID = rand2.Next(2000, 10000);
                int dDetID = rand3.Next(2000, 10000);
                int depCode = rand4.Next(1000, 8000);
                string cCls = "Leg MIAGCM " + depCode.ToString();


                dtLeg.Columns.Add("Case_Number"); dtLeg.Columns.Add("Departure_Detail_Id"); dtLeg.Columns.Add("Departure_Id"); dtLeg.Columns.Add("Cabin_Class"); dtLeg.Columns.Add("Leg_Segment_type"); dtLeg.Columns.Add("Departure_Detail_Capture_Id");
                dtLeg.Columns.Add("DDC_Compartment_Id"); dtLeg.Columns.Add("Compartment_Structure_Id"); dtLeg.Columns.Add("Compartment_Name"); dtLeg.Columns.Add("Compartment_id"); dtLeg.Columns.Add("DDC_Class_Id"); dtLeg.Columns.Add("Class_Structure_Id");
                dtLeg.Columns.Add("Class_Name"); dtLeg.Columns.Add("Class_id"); dtLeg.Columns.Add("DDC_Subclass_Id"); dtLeg.Columns.Add("Subclass_Structure_Id"); dtLeg.Columns.Add("Subclass_Name"); dtLeg.Columns.Add("Subclass_id");
                dtLeg.Columns.Add("Adjusted_Authorizations"); dtLeg.Columns.Add("Adjusted_Availability"); dtLeg.Columns.Add("Adjusted_Bid_Price"); dtLeg.Columns.Add("Adjusted_Boardings"); dtLeg.Columns.Add("Adjusted_Bookings"); dtLeg.Columns.Add("Adjusted_Load_Factor");
                dtLeg.Columns.Add("Adjusted_Physical_Load_Factor"); dtLeg.Columns.Add("Adjusted_Revenue_Gain"); dtLeg.Columns.Add("Adjusted_SCI"); dtLeg.Columns.Add("Authorized_Capacity"); dtLeg.Columns.Add("Average_Fare_Value"); dtLeg.Columns.Add("Booked_Costs");
                dtLeg.Columns.Add("Booked_Revenue"); dtLeg.Columns.Add("Class_Usage_Ratio"); dtLeg.Columns.Add("Confidence"); dtLeg.Columns.Add("Current_Authorizations"); dtLeg.Columns.Add("Current_Availability"); dtLeg.Columns.Add("Current_Bookings");
                dtLeg.Columns.Add("Current_SCI"); dtLeg.Columns.Add("Go_Shows"); dtLeg.Columns.Add("Group_Bookings"); dtLeg.Columns.Add("Group_No_Show_Percentage"); dtLeg.Columns.Add("Limit_Compartment"); dtLeg.Columns.Add("Max_Constraint_Type");
                dtLeg.Columns.Add("Maximum_Authorizations_Constraint"); dtLeg.Columns.Add("Maximum_Leg_Authorization"); dtLeg.Columns.Add("Min_Constraint_Type"); dtLeg.Columns.Add("Minimum_Authorizations_Constraint"); dtLeg.Columns.Add("No_Show_Percentage"); dtLeg.Columns.Add("No_Shows");
                dtLeg.Columns.Add("Overbooking_Amount"); dtLeg.Columns.Add("Overbooking_Cost"); dtLeg.Columns.Add("Physical_Capacity"); dtLeg.Columns.Add("Projected_Authorized_Load_Factor"); dtLeg.Columns.Add("Projected_Boardings"); dtLeg.Columns.Add("Projected_Bookings");
                dtLeg.Columns.Add("Projected_Physical_Load_Factor"); dtLeg.Columns.Add("Projected_Revenue"); dtLeg.Columns.Add("Recommended_Authorized_Load_Factor"); dtLeg.Columns.Add("Recommended_Authorizations"); dtLeg.Columns.Add("Recommended_Availability"); dtLeg.Columns.Add("Recommended_Bid_Price");
                dtLeg.Columns.Add("Recommended_Boardings"); dtLeg.Columns.Add("Recommended_Bookings"); dtLeg.Columns.Add("Recommended_Physical_Load_Factor"); dtLeg.Columns.Add("Recommended_Revenue"); dtLeg.Columns.Add("Recommended_Revenue_Gain"); dtLeg.Columns.Add("Recommended_SCI");
                dtLeg.Columns.Add("Remaining_Cancellations"); dtLeg.Columns.Add("Original_Demand"); dtLeg.Columns.Add("Remaining_Demand"); dtLeg.Columns.Add("Revenue_Target"); dtLeg.Columns.Add("Standard_Deviation"); dtLeg.Columns.Add("Theoretical_Capacity");
                dtLeg.Columns.Add("Total_Booked_Costs"); dtLeg.Columns.Add("Total_Booked_Revenue"); dtLeg.Columns.Add("Total_Group_Bookings"); dtLeg.Columns.Add("Total_Projected_Demand"); dtLeg.Columns.Add("Total_Waitlist"); dtLeg.Columns.Add("Unit_Target");
                dtLeg.Columns.Add("Upsell_Adjusted_Demand"); dtLeg.Columns.Add("Upsell_Authorizations"); dtLeg.Columns.Add("Upsell_Availability"); dtLeg.Columns.Add("Upsell_Boardings"); dtLeg.Columns.Add("Upsell_Bookings"); dtLeg.Columns.Add("Upsell_Probability");
                dtLeg.Columns.Add("Upsell_Revenue"); dtLeg.Columns.Add("Upsell_Revenue_Gain"); dtLeg.Columns.Add("Upsell_SCI"); dtLeg.Columns.Add("Upsell_Remaining_Demand"); dtLeg.Columns.Add("Usage_Ratio"); dtLeg.Columns.Add("Waitlist");
                dtLeg.Columns.Add("Limit_Class"); dtLeg.Columns.Add("rec_limit"); dtLeg.Columns.Add("curr_limit"); dtLeg.Columns.Add("App_Capacity"); dtLeg.Columns.Add("Rec_Capacity"); dtLeg.Columns.Add("Is_Summary");
                dtLeg.Columns.Add("Current_Resource_Limit1"); dtLeg.Columns.Add("Recommand_Resource_Limit1"); dtLeg.Columns.Add("Upsell_Resource_limit1"); dtLeg.Columns.Add("Adjusted_Resource_limit1"); dtLeg.Columns.Add("Current_Resource_Limit2"); dtLeg.Columns.Add("Recommand_Resource_Limit2");
                dtLeg.Columns.Add("Upsell_Resource_limit2"); dtLeg.Columns.Add("Adjusted_Resource_limit2"); dtLeg.Columns.Add("Include_In_Total_Flag"); dtLeg.Columns.Add("Keep_Curr_Auth"); dtLeg.Columns.Add("Discrete_Recomended_Authorization"); dtLeg.Columns.Add("Discrete_Upsell_Authorization");
                dtLeg.Columns.Add("Nesting_Type"); dtLeg.Columns.Add("BookingPickup_DaysPrior_i"); dtLeg.Columns.Add("BookingPickup_Per_DaysPrior_i"); dtLeg.Columns.Add("BookingPickup_DaysPrior_j"); dtLeg.Columns.Add("BookingPickup_Per_DaysPrior_j"); dtLeg.Columns.Add("BookingPickup_DaysPrior_k");
                dtLeg.Columns.Add("BookingPickup_Per_DaysPrior_k"); dtLeg.Columns.Add("SDL_Booked"); dtLeg.Columns.Add("SDL_Booked_Percentage"); dtLeg.Columns.Add("Travelled_Bookings"); dtLeg.Columns.Add("Travelled_Bookings_Percentage"); dtLeg.Columns.Add("PE_Authorization");
                dtLeg.Columns.Add("PE_Availability"); dtLeg.Columns.Add("PE_Booking"); dtLeg.Columns.Add("PE_Boarding"); dtLeg.Columns.Add("PE_Revenue"); dtLeg.Columns.Add("PE_Revenue_Gain"); dtLeg.Columns.Add("Marginal_Fare");
                dtLeg.Columns.Add("Marginal_Demand"); dtLeg.Columns.Add("Price_Elasticity"); dtLeg.Columns.Add("PE_Group_ID"); dtLeg.Columns.Add("PE_Demand"); dtLeg.Columns.Add("Max_Alloc_Hus"); dtLeg.Columns.Add("PAX_Buffer_Hus");
                dtLeg.Columns.Add("PAX_Buffer_Hus_Type"); dtLeg.Columns.Add("Max_Alloc_Berths"); dtLeg.Columns.Add("PAX_Buffer_Berths"); dtLeg.Columns.Add("PAX_Buffer_Berths_Type"); dtLeg.Columns.Add("IS_Sent"); dtLeg.Columns.Add("StepType");
                dtLeg.Columns.Add("Adjusted_Authorizations_Calc"); dtLeg.Columns.Add("SDL_BP_DP_i"); dtLeg.Columns.Add("SDL_BP_DP_j"); dtLeg.Columns.Add("SDL_BP_DP_k"); dtLeg.Columns.Add("current_revenue"); dtLeg.Columns.Add("revenue_SDL");
                dtLeg.Columns.Add("Diff_Bkd_LY"); dtLeg.Columns.Add("Diff_Bkd_SDL"); dtLeg.Columns.Add("Diff_Revenue"); dtLeg.Columns.Add("Max_Booked");

                DataRow drLeg = dtLeg.NewRow();
                drLeg["Case_Number"] = cNo; drLeg["Departure_Detail_Id"] = dDetID; drLeg["Departure_Id"] = dID; drLeg["Cabin_Class"] = cCls; drLeg["Leg_Segment_type"] = "Leg"; drLeg["Departure_Detail_Capture_Id"] = "43824017"; drLeg["DDC_Compartment_Id"] = System.DBNull.Value;
                drLeg["Compartment_Structure_Id"] = System.DBNull.Value; drLeg["Compartment_Name"] = System.DBNull.Value;


                dtLeg.Rows.Add(drLeg);


                dtComp.Columns.Add("Case_Number"); dtComp.Columns.Add("Departure_Detail_Id"); dtComp.Columns.Add("Departure_Id"); dtComp.Columns.Add("Cabin_Class"); dtComp.Columns.Add("Leg_Segment_type"); dtComp.Columns.Add("Departure_Detail_Capture_Id");
                dtComp.Columns.Add("DDC_Compartment_Id"); dtComp.Columns.Add("Compartment_Structure_Id"); dtComp.Columns.Add("Compartment_Name"); dtComp.Columns.Add("Compartment_id"); dtComp.Columns.Add("DDC_Class_Id"); dtComp.Columns.Add("Class_Structure_Id");
                dtComp.Columns.Add("Class_Name"); dtComp.Columns.Add("Class_id"); dtComp.Columns.Add("DDC_Subclass_Id"); dtComp.Columns.Add("Subclass_Structure_Id"); dtComp.Columns.Add("Subclass_Name"); dtComp.Columns.Add("Subclass_id");
                dtComp.Columns.Add("Adjusted_Authorizations"); dtComp.Columns.Add("Adjusted_Availability"); dtComp.Columns.Add("Adjusted_Bid_Price"); dtComp.Columns.Add("Adjusted_Boardings"); dtComp.Columns.Add("Adjusted_Bookings"); dtComp.Columns.Add("Adjusted_Load_Factor");
                dtComp.Columns.Add("Adjusted_Physical_Load_Factor"); dtComp.Columns.Add("Adjusted_Revenue"); dtComp.Columns.Add("Adjusted_Revenue_Gain"); dtComp.Columns.Add("Adjusted_SCI"); dtComp.Columns.Add("Authorized_Capacity"); dtComp.Columns.Add("Average_Fare_Value"); dtComp.Columns.Add("Booked_Costs");
                dtComp.Columns.Add("Booked_Revenue"); dtComp.Columns.Add("Class_Usage_Ratio"); dtComp.Columns.Add("Confidence"); dtComp.Columns.Add("Current_Authorizations"); dtComp.Columns.Add("Current_Availability"); dtComp.Columns.Add("Current_Bookings");
                dtComp.Columns.Add("Current_SCI"); dtComp.Columns.Add("Go_Shows"); dtComp.Columns.Add("Group_Bookings"); dtComp.Columns.Add("Group_No_Show_Percentage"); dtComp.Columns.Add("Limit_Compartment"); dtComp.Columns.Add("Max_Constraint_Type");
                dtComp.Columns.Add("Maximum_Authorizations_Constraint"); dtComp.Columns.Add("Maximum_Leg_Authorization"); dtComp.Columns.Add("Min_Constraint_Type"); dtComp.Columns.Add("Minimum_Authorizations_Constraint"); dtComp.Columns.Add("No_Show_Percentage"); dtComp.Columns.Add("No_Shows");
                dtComp.Columns.Add("Overbooking_Amount"); dtComp.Columns.Add("Overbooking_Cost"); dtComp.Columns.Add("Physical_Capacity"); dtComp.Columns.Add("Projected_Authorized_Load_Factor"); dtComp.Columns.Add("Projected_Boardings"); dtComp.Columns.Add("Projected_Bookings");
                dtComp.Columns.Add("Projected_Physical_Load_Factor"); dtComp.Columns.Add("Projected_Revenue"); dtComp.Columns.Add("Recommended_Authorized_Load_Factor"); dtComp.Columns.Add("Recommended_Authorizations"); dtComp.Columns.Add("Recommended_Availability"); dtComp.Columns.Add("Recommended_Bid_Price");
                dtComp.Columns.Add("Recommended_Boardings"); dtComp.Columns.Add("Recommended_Bookings"); dtComp.Columns.Add("Recommended_Physical_Load_Factor"); dtComp.Columns.Add("Recommended_Revenue"); dtComp.Columns.Add("Recommended_Revenue_Gain"); dtComp.Columns.Add("Recommended_SCI");
                dtComp.Columns.Add("Remaining_Cancellations"); dtComp.Columns.Add("Original_Demand"); dtComp.Columns.Add("Remaining_Demand"); dtComp.Columns.Add("Revenue_Target"); dtComp.Columns.Add("Standard_Deviation"); dtComp.Columns.Add("Theoretical_Capacity");
                dtComp.Columns.Add("Total_Booked_Costs"); dtComp.Columns.Add("Total_Booked_Revenue"); dtComp.Columns.Add("Total_Group_Bookings"); dtComp.Columns.Add("Total_Projected_Demand"); dtComp.Columns.Add("Total_Waitlist"); dtComp.Columns.Add("Unit_Target");
                dtComp.Columns.Add("Upsell_Adjusted_Demand"); dtComp.Columns.Add("Upsell_Authorizations"); dtComp.Columns.Add("Upsell_Availability"); dtComp.Columns.Add("Upsell_Boardings"); dtComp.Columns.Add("Upsell_Bookings"); dtComp.Columns.Add("Upsell_Probability");
                dtComp.Columns.Add("Upsell_Revenue"); dtComp.Columns.Add("Upsell_Revenue_Gain"); dtComp.Columns.Add("Upsell_SCI"); dtComp.Columns.Add("Upsell_Remaining_Demand"); dtComp.Columns.Add("Usage_Ratio"); dtComp.Columns.Add("Waitlist");
                dtComp.Columns.Add("Limit_Class"); dtComp.Columns.Add("rec_limit"); dtComp.Columns.Add("curr_limit"); dtComp.Columns.Add("App_Capacity"); dtComp.Columns.Add("Rec_Capacity"); dtComp.Columns.Add("Is_Summary");
                dtComp.Columns.Add("Current_Resource_Limit1"); dtComp.Columns.Add("Recommand_Resource_Limit1"); dtComp.Columns.Add("Upsell_Resource_limit1"); dtComp.Columns.Add("Adjusted_Resource_limit1"); dtComp.Columns.Add("Current_Resource_Limit2"); dtComp.Columns.Add("Recommand_Resource_Limit2");
                dtComp.Columns.Add("Upsell_Resource_limit2"); dtComp.Columns.Add("Adjusted_Resource_limit2"); dtComp.Columns.Add("Include_In_Total_Flag"); dtComp.Columns.Add("Keep_Curr_Auth"); dtComp.Columns.Add("Discrete_Recomended_Authorization"); dtComp.Columns.Add("Discrete_Upsell_Authorization");
                dtComp.Columns.Add("Nesting_Type"); dtComp.Columns.Add("BookingPickup_DaysPrior_i"); dtComp.Columns.Add("BookingPickup_Per_DaysPrior_i"); dtComp.Columns.Add("BookingPickup_DaysPrior_j"); dtComp.Columns.Add("BookingPickup_Per_DaysPrior_j"); dtComp.Columns.Add("BookingPickup_DaysPrior_k");
                dtComp.Columns.Add("BookingPickup_Per_DaysPrior_k"); dtComp.Columns.Add("SDL_Booked"); dtComp.Columns.Add("SDL_Booked_Percentage"); dtComp.Columns.Add("Travelled_Bookings"); dtComp.Columns.Add("Travelled_Bookings_Percentage"); dtComp.Columns.Add("PE_Authorization");
                dtComp.Columns.Add("PE_Availability"); dtComp.Columns.Add("PE_Booking"); dtComp.Columns.Add("PE_Boarding"); dtComp.Columns.Add("PE_Revenue"); dtComp.Columns.Add("PE_Revenue_Gain"); dtComp.Columns.Add("Marginal_Fare");
                dtComp.Columns.Add("Marginal_Demand"); dtComp.Columns.Add("Price_Elasticity"); dtComp.Columns.Add("PE_Group_ID"); dtComp.Columns.Add("PE_Demand"); dtComp.Columns.Add("Max_Alloc_Hus"); dtComp.Columns.Add("PAX_Buffer_Hus");
                dtComp.Columns.Add("PAX_Buffer_Hus_Type"); dtComp.Columns.Add("Max_Alloc_Berths"); dtComp.Columns.Add("PAX_Buffer_Berths"); dtComp.Columns.Add("PAX_Buffer_Berths_Type"); dtComp.Columns.Add("IS_Sent"); dtComp.Columns.Add("StepType");
                dtComp.Columns.Add("Adjusted_Authorizations_Calc"); dtComp.Columns.Add("SDL_BP_DP_i"); dtComp.Columns.Add("SDL_BP_DP_j"); dtComp.Columns.Add("SDL_BP_DP_k"); dtComp.Columns.Add("current_revenue"); dtComp.Columns.Add("revenue_SDL");
                dtComp.Columns.Add("Diff_Bkd_LY"); dtComp.Columns.Add("Diff_Bkd_SDL"); dtComp.Columns.Add("Diff_Revenue"); dtComp.Columns.Add("Max_Booked"); dtComp.Columns.Add("COMPARTMENT_STRUCTURE_COMPARTMENT_ORDER");

               

                DataRow drComp = dtComp.NewRow();
                drComp["Case_Number"] = cNo; drComp["Departure_Detail_Id"] = dDetID; drComp["Departure_Id"] = dID; drComp["Cabin_Class"] = cCls; drComp["Leg_Segment_type"] = "Leg"; drComp["Departure_Detail_Capture_Id"] = "43824017"; drComp["DDC_Compartment_Id"] = "60513359";
                drComp["Compartment_Structure_Id"] = 4; drComp["Compartment_Name"] = "J"; drComp["Compartment_id"] = 1; drComp["Adjusted_Authorizations"] = 8; drComp["Adjusted_Availability"] = 7; drComp["Adjusted_Boardings"] = 1; drComp["Adjusted_Bookings"] = 1;
                drComp["Adjusted_Load_Factor"] = 0; drComp["Adjusted_Revenue"] = 349; drComp["Current_Authorizations"] = 8; drComp["Current_Availability"] = 7;

                dtComp.Rows.Add(drComp);

                DataRow drComp1 = dtComp.NewRow();
                drComp1["Case_Number"] = cNo; drComp1["Departure_Detail_Id"] = dDetID; drComp1["Departure_Id"] = dID; drComp1["Cabin_Class"] = cCls; drComp1["Leg_Segment_type"] = "Leg"; drComp1["Departure_Detail_Capture_Id"] = "43824017"; drComp1["DDC_Compartment_Id"] = "60513360";
                drComp1["Compartment_Structure_Id"] = 5; drComp1["Compartment_Name"] = "Y"; drComp1["Compartment_id"] = 2; drComp1["Adjusted_Authorizations"] = 114; drComp1["Adjusted_Availability"] = 97; drComp1["Adjusted_Boardings"] = 39; drComp1["Adjusted_Bookings"] = 39;
                drComp1["Adjusted_Load_Factor"] = 0; drComp1["Adjusted_Revenue"] = 350; drComp1["Current_Authorizations"] = 10; drComp1["Current_Availability"] = 10;

                dtComp.Rows.Add(drComp1);

                dtClass.Columns.Add("Case_Number"); dtClass.Columns.Add("Departure_Detail_Id"); dtClass.Columns.Add("Departure_Id"); dtClass.Columns.Add("Cabin_Class"); dtClass.Columns.Add("Leg_Segment_type"); dtClass.Columns.Add("Departure_Detail_Capture_Id");
                dtClass.Columns.Add("DDC_Compartment_Id"); dtClass.Columns.Add("Compartment_Structure_Id"); dtClass.Columns.Add("Compartment_Name"); dtClass.Columns.Add("Compartment_id"); dtClass.Columns.Add("DDC_Class_Id"); dtClass.Columns.Add("Class_Structure_Id");
                dtClass.Columns.Add("Class_Name"); dtClass.Columns.Add("Class_id"); dtClass.Columns.Add("DDC_Subclass_Id"); dtClass.Columns.Add("Subclass_Structure_Id"); dtClass.Columns.Add("Subclass_Name"); dtClass.Columns.Add("Subclass_id");
                dtClass.Columns.Add("Adjusted_Authorizations"); dtClass.Columns.Add("Adjusted_Availability"); dtClass.Columns.Add("Adjusted_Bid_Price"); dtClass.Columns.Add("Adjusted_Boardings"); dtClass.Columns.Add("Adjusted_Bookings"); dtClass.Columns.Add("Adjusted_Load_Factor");
                dtClass.Columns.Add("Adjusted_Physical_Load_Factor"); dtClass.Columns.Add("Adjusted_Revenue"); dtClass.Columns.Add("Adjusted_Revenue_Gain"); dtClass.Columns.Add("Adjusted_SCI"); dtClass.Columns.Add("Authorized_Capacity"); dtClass.Columns.Add("Average_Fare_Value"); dtClass.Columns.Add("Booked_Costs");
                dtClass.Columns.Add("Booked_Revenue"); dtClass.Columns.Add("Class_Usage_Ratio"); dtClass.Columns.Add("Confidence"); dtClass.Columns.Add("Current_Authorizations"); dtClass.Columns.Add("Current_Availability"); dtClass.Columns.Add("Current_Bookings");
                dtClass.Columns.Add("Current_SCI"); dtClass.Columns.Add("Go_Shows"); dtClass.Columns.Add("Group_Bookings"); dtClass.Columns.Add("Group_No_Show_Percentage"); dtClass.Columns.Add("Limit_Compartment"); dtClass.Columns.Add("Max_Constraint_Type");
                dtClass.Columns.Add("Maximum_Authorizations_Constraint"); dtClass.Columns.Add("Maximum_Leg_Authorization"); dtClass.Columns.Add("Min_Constraint_Type"); dtClass.Columns.Add("Minimum_Authorizations_Constraint"); dtClass.Columns.Add("No_Show_Percentage"); dtClass.Columns.Add("No_Shows");
                dtClass.Columns.Add("Overbooking_Amount"); dtClass.Columns.Add("Overbooking_Cost"); dtClass.Columns.Add("Physical_Capacity"); dtClass.Columns.Add("Projected_Authorized_Load_Factor"); dtClass.Columns.Add("Projected_Boardings"); dtClass.Columns.Add("Projected_Bookings");
                dtClass.Columns.Add("Projected_Physical_Load_Factor"); dtClass.Columns.Add("Projected_Revenue"); dtClass.Columns.Add("Recommended_Authorized_Load_Factor"); dtClass.Columns.Add("Recommended_Authorizations"); dtClass.Columns.Add("Recommended_Availability"); dtClass.Columns.Add("Recommended_Bid_Price");
                dtClass.Columns.Add("Recommended_Boardings"); dtClass.Columns.Add("Recommended_Bookings"); dtClass.Columns.Add("Recommended_Physical_Load_Factor"); dtClass.Columns.Add("Recommended_Revenue"); dtClass.Columns.Add("Recommended_Revenue_Gain"); dtClass.Columns.Add("Recommended_SCI");
                dtClass.Columns.Add("Remaining_Cancellations"); dtClass.Columns.Add("Original_Demand"); dtClass.Columns.Add("Remaining_Demand"); dtClass.Columns.Add("Revenue_Target"); dtClass.Columns.Add("Standard_Deviation"); dtClass.Columns.Add("Theoretical_Capacity");
                dtClass.Columns.Add("Total_Booked_Costs"); dtClass.Columns.Add("Total_Booked_Revenue"); dtClass.Columns.Add("Total_Group_Bookings"); dtClass.Columns.Add("Total_Projected_Demand"); dtClass.Columns.Add("Total_Waitlist"); dtClass.Columns.Add("Unit_Target");
                dtClass.Columns.Add("Upsell_Adjusted_Demand"); dtClass.Columns.Add("Upsell_Authorizations"); dtClass.Columns.Add("Upsell_Availability"); dtClass.Columns.Add("Upsell_Boardings"); dtClass.Columns.Add("Upsell_Bookings"); dtClass.Columns.Add("Upsell_Probability");
                dtClass.Columns.Add("Upsell_Revenue"); dtClass.Columns.Add("Upsell_Revenue_Gain"); dtClass.Columns.Add("Upsell_SCI"); dtClass.Columns.Add("Upsell_Remaining_Demand"); dtClass.Columns.Add("Usage_Ratio"); dtClass.Columns.Add("Waitlist");
                dtClass.Columns.Add("Limit_Class"); dtClass.Columns.Add("rec_limit"); dtClass.Columns.Add("curr_limit"); dtClass.Columns.Add("App_Capacity"); dtClass.Columns.Add("Rec_Capacity"); dtClass.Columns.Add("Is_Summary");
                dtClass.Columns.Add("Current_Resource_Limit1"); dtClass.Columns.Add("Recommand_Resource_Limit1"); dtClass.Columns.Add("Upsell_Resource_limit1"); dtClass.Columns.Add("Adjusted_Resource_limit1"); dtClass.Columns.Add("Current_Resource_Limit2"); dtClass.Columns.Add("Recommand_Resource_Limit2");
                dtClass.Columns.Add("Upsell_Resource_limit2"); dtClass.Columns.Add("Adjusted_Resource_limit2"); dtClass.Columns.Add("Include_In_Total_Flag"); dtClass.Columns.Add("Keep_Curr_Auth"); dtClass.Columns.Add("Discrete_Recomended_Authorization"); dtClass.Columns.Add("Discrete_Upsell_Authorization");
                dtClass.Columns.Add("Nesting_Type"); dtClass.Columns.Add("BookingPickup_DaysPrior_i"); dtClass.Columns.Add("BookingPickup_Per_DaysPrior_i"); dtClass.Columns.Add("BookingPickup_DaysPrior_j"); dtClass.Columns.Add("BookingPickup_Per_DaysPrior_j"); dtClass.Columns.Add("BookingPickup_DaysPrior_k");
                dtClass.Columns.Add("BookingPickup_Per_DaysPrior_k"); dtClass.Columns.Add("SDL_Booked"); dtClass.Columns.Add("SDL_Booked_Percentage"); dtClass.Columns.Add("Travelled_Bookings"); dtClass.Columns.Add("Travelled_Bookings_Percentage"); dtClass.Columns.Add("PE_Authorization");
                dtClass.Columns.Add("PE_Availability"); dtClass.Columns.Add("PE_Booking"); dtClass.Columns.Add("PE_Boarding"); dtClass.Columns.Add("PE_Revenue"); dtClass.Columns.Add("PE_Revenue_Gain"); dtClass.Columns.Add("Marginal_Fare");
                dtClass.Columns.Add("Marginal_Demand"); dtClass.Columns.Add("Price_Elasticity"); dtClass.Columns.Add("PE_Group_ID"); dtClass.Columns.Add("PE_Demand"); dtClass.Columns.Add("Max_Alloc_Hus"); dtClass.Columns.Add("PAX_Buffer_Hus");
                dtClass.Columns.Add("PAX_Buffer_Hus_Type"); dtClass.Columns.Add("Max_Alloc_Berths"); dtClass.Columns.Add("PAX_Buffer_Berths"); dtClass.Columns.Add("PAX_Buffer_Berths_Type"); dtClass.Columns.Add("IS_Sent"); dtClass.Columns.Add("StepType");
                dtClass.Columns.Add("Adjusted_Authorizations_Calc"); dtClass.Columns.Add("SDL_BP_DP_i"); dtClass.Columns.Add("SDL_BP_DP_j"); dtClass.Columns.Add("SDL_BP_DP_k"); dtClass.Columns.Add("current_revenue"); dtClass.Columns.Add("revenue_SDL");
                dtClass.Columns.Add("Diff_Bkd_LY"); dtClass.Columns.Add("Diff_Bkd_SDL"); dtClass.Columns.Add("Diff_Revenue"); dtClass.Columns.Add("Max_Booked"); dtClass.Columns.Add("COMPARTMENT_STRUCTURE_COMPARTMENT_ORDER");


                DataRow drClass = dtClass.NewRow();
                drClass["Case_Number"] = cNo; drClass["Departure_Detail_Id"] = dDetID; drClass["Departure_Id"] = dID; drClass["Cabin_Class"] = cCls; drClass["Leg_Segment_type"] = "Leg"; drClass["Departure_Detail_Capture_Id"] = "43824017"; drClass["DDC_Compartment_Id"] = "60513360";
                drClass["Compartment_Structure_Id"] = 5; drClass["Compartment_Name"] = "Y"; drClass["Compartment_id"] = 2; drClass["DDC_Class_Id"] = "6022025"; drClass["Class_Structure_Id"] = 4;
                drClass["Class_Name"] = "Y"; drClass["Class_id"] = 4; drClass["Adjusted_Authorizations"] = 8; drClass["Adjusted_Availability"] = 7; drClass["Adjusted_Boardings"] = 1; drClass["Adjusted_Bookings"] = 1;
                drClass["Adjusted_Load_Factor"] = 0; drClass["Adjusted_Revenue"] = 349; drClass["Current_Authorizations"] = 8; drClass["Current_Availability"] = 7;

                dtClass.Rows.Add(drClass);

                DataRow drClass1 = dtClass.NewRow();
                drClass1["Case_Number"] = cNo; drClass1["Departure_Detail_Id"] = dDetID; drClass1["Departure_Id"] = dID; drClass1["Cabin_Class"] = cCls; drClass1["Leg_Segment_type"] = "Leg"; drClass1["Departure_Detail_Capture_Id"] = "43824017"; drClass1["DDC_Compartment_Id"] = "60513359";
                drClass1["Compartment_Structure_Id"] = 4; drClass1["Compartment_Name"] = "J"; drClass1["Compartment_id"] = 1; drClass1["DDC_Class_Id"] = "6022020"; drClass1["Class_Structure_Id"] = 1;
                drClass1["Class_Name"] = "J"; drClass1["Class_id"] = 1; drClass1["Adjusted_Authorizations"] = 8; drClass1["Adjusted_Availability"] = 7; drClass1["Adjusted_Boardings"] = 1; drClass1["Adjusted_Bookings"] = 1;
                drClass1["Adjusted_Load_Factor"] = 0; drClass1["Adjusted_Revenue"] = 349; drClass1["Current_Authorizations"] = 8; drClass1["Current_Availability"] = 7;

                dtClass.Rows.Add(drClass1);

                DataRow drClass2 = dtClass.NewRow();
                drClass2["Case_Number"] = cNo; drClass2["Departure_Detail_Id"] = dDetID; drClass2["Departure_Id"] = dID; drClass2["Cabin_Class"] = cCls; drClass2["Leg_Segment_type"] = "Leg"; drClass2["Departure_Detail_Capture_Id"] = "43824017"; drClass2["DDC_Compartment_Id"] = "60513359";
                drClass2["Compartment_Structure_Id"] = 4; drClass2["Compartment_Name"] = "J"; drClass2["Compartment_id"] = 1; drClass2["DDC_Class_Id"] = "6022020"; drClass2["Class_Structure_Id"] = 17;
                drClass2["Class_Name"] = "C"; drClass2["Class_id"] = 17; drClass2["Adjusted_Authorizations"] = 8; drClass2["Adjusted_Availability"] = 7; drClass2["Adjusted_Boardings"] = 1; drClass2["Adjusted_Bookings"] = 1;
                drClass2["Adjusted_Load_Factor"] = 0; drClass2["Adjusted_Revenue"] = 349; drClass2["Current_Authorizations"] = 8; drClass2["Current_Availability"] = 7;

                dtClass.Rows.Add(drClass2);


                BindGrid();
            }
            catch(Exception)
            {
                throw;
            }
        }

        private void BindGrid()
        {
            try
            {

                radGridWorksheet.MasterTemplate.Templates.Clear();
                radGridWorksheet.Relations.Clear();
                radGridWorksheet.DataSource = dtLeg;
                radGridWorksheet.AllowAddNewRow = false;
                radGridWorksheet.AllowDeleteRow = false;
                radGridWorksheet.AllowEditRow = true;
                radGridWorksheet.AutoGenerateColumns = true;
                radGridWorksheet.BestFitColumns();
                radGridWorksheet.GridViewElement.DrawBorder = false;
                radGridWorksheet.GridViewElement.GroupPanelElement.DrawBorder = false;

                GridViewTemplate childDetailCaptureDate = new GridViewTemplate();
                childDetailCaptureDate.Caption = "Leg";
                childDetailCaptureDate.Columns.Clear();
                childDetailCaptureDate.AllowAddNewRow = false;
                childDetailCaptureDate.AllowDeleteRow = false;
                childDetailCaptureDate.AllowEditRow = true;
                childDetailCaptureDate.AutoGenerateColumns = true;
                childDetailCaptureDate.BestFitColumns();
                childDetailCaptureDate.DataSource = dtComp;
                radGridWorksheet.MasterTemplate.Templates.Add(childDetailCaptureDate);
                GridViewRelation relationCaptureDate = new GridViewRelation(radGridWorksheet.MasterTemplate);
                relationCaptureDate.ChildTemplate = childDetailCaptureDate;
                relationCaptureDate.RelationName = "Capture";
                relationCaptureDate.ParentColumnNames.Add("Departure_Detail_Capture_Id");
                relationCaptureDate.ChildColumnNames.Add("Departure_Detail_Capture_Id");
                radGridWorksheet.Relations.Add(relationCaptureDate);

                GridViewTemplate childDetailCaptureDateComp = new GridViewTemplate();
                childDetailCaptureDateComp.Caption = "Comp";
                childDetailCaptureDateComp.Columns.Clear();
                childDetailCaptureDateComp.AllowAddNewRow = false;
                childDetailCaptureDateComp.AllowDeleteRow = false;
                childDetailCaptureDateComp.AllowEditRow = true;
                childDetailCaptureDateComp.AutoGenerateColumns = true;
                childDetailCaptureDateComp.BestFitColumns();
                childDetailCaptureDateComp.DataSource = dtClass;
                childDetailCaptureDate.Templates.Add(childDetailCaptureDateComp);
                GridViewRelation relationCaptureDateCompatment = new GridViewRelation(childDetailCaptureDate);
                relationCaptureDateCompatment.ChildTemplate = childDetailCaptureDateComp;
                relationCaptureDateCompatment.RelationName = "Compartment";
                relationCaptureDateCompatment.ParentColumnNames.Add("DDC_Compartment_Id");
                relationCaptureDateCompatment.ChildColumnNames.Add("DDC_Compartment_Id");
                radGridWorksheet.Relations.Add(relationCaptureDateCompatment); 

                radGridWorksheet.MasterTemplate.ExpandAll();

            }
            catch(Exception e0)
            { 
                MessageBox.Show(String.Format("{0}\n{1}", e0.Message, e0.StackTrace));
                throw;

            }
        }

        private void radButton1_Click(object sender, EventArgs e)
        {
            try
            {
                intClickCount = intClickCount + 1;
                //Thread.Sleep(1000);
                radButton1.Text = "Next Click " + intClickCount;
                BindTables();
            }
            catch(Exception e0)
            { 
                MessageBox.Show(String.Format("{0}\n{1}", e0.Message, e0.StackTrace));
                throw;

            }

        }
    }
Completed
Last Updated: 21 Jun 2018 13:33 by ADMIN
Setting the FormatString of a column in the child template does not seem to take effect.
Completed
Last Updated: 21 Jun 2018 13:23 by ADMIN
Workaround: handle the SortChanging and FilterChanging events and clear the search criteria from the search row. The stored search string can later be restored in the SortChanged and FilterChanged events

string filter = string.Empty;
private void RadGrid_FilterChanged(object sender, GridViewCollectionChangedEventArgs e)
{
    this.radGrid.MasterView.TableSearchRow.Search(filter);
}

private void RadGrid_SortChanged(object sender, GridViewCollectionChangedEventArgs e)
{
    this.radGrid.MasterView.TableSearchRow.Search(filter);
}

private void RadGrid_SortChanging(object sender, GridViewCollectionChangingEventArgs e)
{
    this.filter = this.radGrid.MasterView.TableSearchRow.SearchCriteria;
    this.radGrid.MasterView.TableSearchRow.Search(null);
}

private void RadGrid_FilterChanging(object sender, GridViewCollectionChangingEventArgs e)
{
    this.filter = this.radGrid.MasterView.TableSearchRow.SearchCriteria;
    this.radGrid.MasterView.TableSearchRow.Search(null);
}


Declined
Last Updated: 18 Jun 2018 13:24 by ADMIN
To reproduce, add menu item in the filtering context menu and upon click, set it as checked. Note that the filtering cell text should also take the custom menu item text or there should be an approach to set it.
Workaround: uncomment the commented code below.

protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            AddGrid();

            DataTable dt = new DataTable();
            dt.Columns.Add("Id", typeof(int));
            dt.Columns.Add("Name", typeof(string));

            for (int i = 0; i < 5; i++)
            {
                dt.Rows.Add(i, "Item" + i);
            }
            dt.Rows.Add(5, null);
            dt.Rows.Add(6, "");

            radGridView1.ShowHeaderCellButtons = true;
            this.radGridView1.DataSource = dt;
            this.radGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill;
            this.radGridView1.EnableFiltering = true;
            this.radGridView1.EnableCustomFiltering = true;
            //radGridView1.ContextMenuOpening += radGridView1_ContextMenuOpening;
        }

        private void radGridView1_ContextMenuOpening(object sender, Telerik.WinControls.UI.ContextMenuOpeningEventArgs e)
        {
            GridFilterCellElement filterCell = e.ContextMenuProvider as GridFilterCellElement;
            GridViewDataColumn dataCol = (GridViewDataColumn)filterCell.ColumnInfo;
            if (filterCell != null)
            {
                if (filterCell.ColumnInfo.Name == "Name")
                {
                    RadMenuItem isNullMenuItem = new RadMenuItem();
                    isNullMenuItem.Click += customMenuItem_Click;
                    isNullMenuItem.Text = "My IsNull";
                    isNullMenuItem.Tag = filterCell.ColumnInfo.Name;
                    e.ContextMenu.Items.Add(isNullMenuItem);

                    RadMenuItem isNotNullMenuItem = new RadMenuItem();
                    isNotNullMenuItem.Click += customMenuItem_Click;
                    isNotNullMenuItem.Text = "My IsNotNull";
                    isNotNullMenuItem.Tag = filterCell.ColumnInfo.Name;
                    e.ContextMenu.Items.Add(isNotNullMenuItem);

                    bool isCustomFilter = (dataCol.FilterDescriptor != null &&
                        dataCol.FilterDescriptor is CompositeFilterDescriptor &&
                        dataCol.FilterDescriptor.Expression.Contains("NULL"));

                    foreach (RadMenuItem item in e.ContextMenu.Items)
                    {
                        if (item.Text == "Is null" || item.Text == "Is not null")
                        {
                            item.Visibility = Telerik.WinControls.ElementVisibility.Collapsed;
                        }
                        //if (isCustomFilter)
                        //{
                        //    item.IsChecked = false;
                        //}
                    }
                    //if (isCustomFilter)
                    //{
                    //    if (((CompositeFilterDescriptor)dataCol.FilterDescriptor).LogicalOperator == FilterLogicalOperator.And)
                    //    {
                    //        isNotNullMenuItem.IsChecked = true;
                    //    }
                    //    else
                    //    {
                    //        isNullMenuItem.IsChecked = true;
                    //    }
                    //}
                }
            }
        }

        private void customMenuItem_Click(object sender, EventArgs e)
        {
            RadMenuItem clickedItem = (RadMenuItem)sender;
            string columnName = clickedItem.Tag.ToString();
            radGridView1.Columns[columnName].FilterDescriptor = null;

            FilterOperator filterOperator = clickedItem.Text.Contains("Not") ? FilterOperator.IsNotEqualTo : FilterOperator.IsEqualTo;
            FilterLogicalOperator logicalOperator = clickedItem.Text.Contains("Not") ? FilterLogicalOperator.And : FilterLogicalOperator.Or;

            CompositeFilterDescriptor compositeFilter = new CompositeFilterDescriptor();
            compositeFilter.FilterDescriptors.Add(new FilterDescriptor(columnName, filterOperator, ""));
            compositeFilter.FilterDescriptors.Add(new FilterDescriptor(columnName, filterOperator, null));
            compositeFilter.LogicalOperator = logicalOperator;
            compositeFilter.IsFilterEditor = true;
            this.radGridView1.FilterDescriptors.Add(compositeFilter);

            clickedItem.IsChecked = true;
        }
Completed
Last Updated: 15 Jun 2018 13:51 by Dimitar
To reproduce: set Excel-like filter according to the online documentation: https://docs.telerik.com/devtools/winforms/gridview/filtering/setting-filters-programmatically-(composite-descriptors)

            this.radGridView1.DataSource = this.productsBindingSource;
            this.productsTableAdapter.Fill(this.nwindDataSet.Products);

            this.radGridView1.EnableFiltering = true;
            this.radGridView1.ShowHeaderCellButtons = true;
            
            var filterDescriptor = new FilterDescriptor();
            filterDescriptor.PropertyName = "UnitsInStock";
            filterDescriptor.Value = 101;
            filterDescriptor.Operator = FilterOperator.IsEqualTo;

            var filterDescriptor2 = new FilterDescriptor();
            filterDescriptor2.PropertyName = "UnitsInStock";
            filterDescriptor2.Value = 104;
            filterDescriptor2.Operator = FilterOperator.IsEqualTo;
            var cfd = new CompositeFilterDescriptor();
            cfd.LogicalOperator = FilterLogicalOperator.Or;
            cfd.FilterDescriptors.Add(filterDescriptor);
            cfd.FilterDescriptors.Add(filterDescriptor2);
            cfd.IsFilterEditor = true;
            this.radGridView1.FilterDescriptors.Add(cfd);
            this.radGridView1.MasterTemplate.ExcelFilteredColumns.Add(this.radGridView1.Columns["UnitsInStock"]);

You will notice that the filter popup contains all possible values for this column which is OK, but none of the nodes is checked. It is necessary the visible rows to be checked. 

Workaround: check the nodes programmatically when the popup is shown:

        private void radGridView1_FilterPopupInitialized(object sender, Telerik.WinControls.UI.FilterPopupInitializedEventArgs e)
        {
            RadListFilterPopup popup = e.FilterPopup as RadListFilterPopup;
            if (popup!=null)
            {
                popup.Tag = e.Column.Name;
               popup.PopupOpened-=popup_PopupOpened;
                popup.PopupOpened+=popup_PopupOpened;
            }
        }

        private void popup_PopupOpened(object sender, EventArgs args)
        {
           RadListFilterPopup popup = sender as RadListFilterPopup;

           foreach (GridViewRowInfo row in this.radGridView1.ChildRows)
           {
             RadTreeNode node=   popup.MenuTreeElement.TreeView.FindNodes(row.Cells[popup.Tag+""].Value.ToString()).FirstOrDefault();
             if (node!=null)
             {
                 node.Checked = true;
             }
           }
        }
Completed
Last Updated: 15 Jun 2018 13:21 by Dimitar
To reproduce: run the attached sample project. Type "res" in the search box very very fast. You will notice that the results with starting with "re" are highlighted. 

Note: it is usually reproducible the first serahc after loading the form.