I already have a work-around and I don't have time to craft an example.
When running two dispatchers in different threads, ie launching the following code twice:
public void LaunchInThread()
{
Thread _thread = new Thread(() =>
{
Application app = new Application();
app.Run(new Window());
});
_thread.SetApartmentState(ApartmentState.STA);
_thread.Start();
}
And setting column hierarchical column headers to some but not all columns by code, ie:
if( ! first_column){ column.ColumnGroupName = "groupName"; if (radGridView.ColumnGroups.FirstOrDefault(x => x.Name == "groupName") != null) return; radGridView.ColumnGroups.Add(new GridViewColumnGroup { Header = "groupName", Name = "groupName" }); }
My guess is that when no header is set, by default an static empty GridViewColumnGroup is reused. And as it's non-freezable it crashes.
The result string contains wrong header positions and some headers could be missing when the copy of cells (including the header cells) of a column is cancelled using the CopyingCellClipboardContent event. This happens when the ClipboardCopyMode is set to "Cells,Header".
To work this around, you can override the Copied event and replace the string part from the clipboard that contains the headers, with your custom variant.
private void RadGridView_Copied(object sender, Telerik.Windows.RadRoutedEventArgs e)
{
string copiedData = Clipboard.GetText();
int headerEndIndex = copiedData.IndexOf("\r\n");
string headerString = copiedData.Substring(0, headerEndIndex) + "\r\n";
copiedData = copiedData.Remove(0, headerEndIndex);
var gridView = (RadGridView)sender;
var filteredColumns = gridView.Columns.OfType<Telerik.Windows.Controls.GridViewColumn>()
.OrderBy(x => x.DisplayIndex)
.Where(x => x.IsVisible && !excludedColumns.Contains(x));
// Where excludedColumns list contains the columns that shouldn't be copied. In this example, this collection is used in the CopyingCellClipboardContent event handler to remove the corresponding columns from the clipboard copy process.
string newHeader = string.Empty;
for (int i = 0; i < filteredColumns.Count(); i++)
{
var column = filteredColumns.ElementAt(i);
newHeader += column.Header.ToString();
if (i < filteredColumns.Count() - 1)
{
newHeader += "\t";
}
}
copiedData = newHeader + copiedData;
Clipboard.SetText(copiedData);
}
I have a GridView, with ClipboardCopyMode set to "Cells, Header" and defined event CopyingCellClipboardContent :
private void RadGridView1_CopyingCellClipboardContent(object sender, GridViewCellClipboardEventArgs e)
{
// _excludedcolumns = columns excluded from copy operation set in logic before
if (_excludedcolumns.Contains(e.Cell.Column))
{
e.Cancel = true;
}
}
Header cells are empty, not skipped like ordinary cells.
Regards
Janez
Hello,
Regarding this forum question, it will be good if you add the attached property VisibleColumnsCount or IsAnyColumnVisible so I can hide the rows when there are 0 columns. Please read the following link for full information:
https://www.telerik.com/forums/radgridview---hide-rows-when-columns-are-not-visible
I have a license ok behalf my company
Currently, the GridViewMergedCell cannot be selected. Allow selecting the merged cells via the UI or code.
At the moment RadGridView has only a CurrentMergedCell property.
In the following scenario:
<telerik:RadGridView x:Name="clubsGrid" ItemsSource="{Binding Foos}" AutoGenerateColumns="False">
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn DataMemberBinding="{Binding Foo1}" MinWidth="100" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Foo2}" MinWidth="100" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Foo3}" Width="*" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Foo4}" MinWidth="100" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Foo5}" MinWidth="100" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Foo6}" MinWidth="100" />
</telerik:RadGridView.Columns>
</telerik:RadGridView>
<DataGrid ItemsSource="{Binding Foos}" AutoGenerateColumns="False" Grid.Row="1">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Foo1}" MinWidth="100" />
<DataGridTextColumn Binding="{Binding Foo2}" MinWidth="100" />
<DataGridTextColumn Binding="{Binding Foo3}" Width="*" />
<DataGridTextColumn Binding="{Binding Foo4}" MinWidth="100" />
<DataGridTextColumn Binding="{Binding Foo5}" MinWidth="100" />
<DataGridTextColumn Binding="{Binding Foo6}" MinWidth="100" />
</DataGrid.Columns>
</DataGrid>
in the native DataGrid after the Width of Foo4 column is increased towards Foo3, then the Width of Foo5/Foo6 columns can also be increased. We can implement similar behavior in the RadGridView as well.
Pixel bug in Lightweight Templates of RadGridView in VisualStudio2013 and Office2013 themes:
No horizontal grid lines when cell has background color:
Most likely bottom margin of PART_CellBorder not set in VisualStudio2013 Theme. In Office2016 PART_CellBorder.Margin="0 0 0 1"
Special chars '+', '-'. '"" modify the default search criteria in the search as you type feature.
Add option to disable this behavior. It would be useful in scenarios with strings starting with + or -.
Also option should be available for setting in MultiColumnComboBox.
The background of the GridView's group headers has a light background in the dark color variation of the Windows 11 theme.
This reproduces only the GroupRenderMode property of RadGridView is set to Nested (the default value).
To work this around set the GroupRenderMode property of RadGridView to Flat.
This issue manifests when RadGridView loaded some columns first (which are working) and then add more columns. The additional columns cannot paste values in their cells.
To work this around, mark the new columns as auto generated and call one of the internal methods.
newColumn.IsAutoGenerated = true;
this.gridView.Columns.Add(newColumn);
var collectionViewPropInfo = this.gridView.Items.GetType().GetProperty("CollectionView", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
var qcv = (QueryableCollectionView)collectionViewPropInfo.GetValue(this.gridView.Items);
var methodInfo = qcv.GetType().GetMethod("OnElementTypeChanged", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
methodInfo.Invoke(qcv, new object[0]);