Our prototype application was originally one DataGrid displayed within the application.
I've been converting the application to use docking windows. The idea is to display multiple docking views. Each one contains a DataGrid.
I've run into several problems with the docking views.
1) If the C1DockTabItem contains a DataGrid, I get the following exception:
Value does not fall within specified range.
This happens anytime I resize the application window. Also when dragging dock view around.
2) At one point, I tried altering my XAML so that the DataGrid was a child of a StackPanel. Silverlight seems to hate this. If I alter the XAML in that manner, then the DataGrid renders very slowly. This XAML change does not prevent the exceptions from occurring.
Here is my current XAML for the docking view:
<c1Docking:C1DockTabControl x:Class="ReportViewer.View.DataSetDockTab" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c1grid="clr-namespace:C1.Silverlight.DataGrid;assembly=C1.Silverlight.DataGrid" xmlns:c1Docking="clr-namespace:C1.Silverlight.Docking;assembly=C1.Silverlight.Docking" DockMode="Docked" TabItemShape="Sloped" TabItemClose="GlobalClose" TabItemClosed="DockTab_TabItemClosed" CanUserHide="False" Loaded="C1DockTabControl_Loaded"> <c1Docking:C1DockTabItem Header="New Table"> <Grid Background="Bisque"> <Grid.RowDefinitions> <RowDefinition Height="48"/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> </Grid.ColumnDefinitions> <Grid Background="CadetBlue"> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> </Grid.ColumnDefinitions> <TextBlock Grid.Row="0" x:Name="MasterGridReportTitle" FontSize="16" HorizontalAlignment="Center"/> <TextBlock Grid.Row="1" x:Name="MasterGridReportDateRange" FontSize="12" HorizontalAlignment="Center"/> </Grid> <c1grid:C1DataGrid Grid.Row="1" x:Name="C1MasterGrid" CanUserGroup="True" CanUserFreezeColumns="True" CanUserAddRows="False" CanUserEditRows="False" CanUserFilter="True" CanUserRemoveRows="False" CanUserReorderColumns="True" CanUserResizeColumns="True" CanUserResizeRows="False" CanUserSort="True" CanUserToggleDetails="True" AutoGeneratingColumn="C1MasterGrid_AutoGeneratingColumn" ColumnsLoaded="C1MasterGrid_ColumnsLoaded" CreatingRow="C1MasterGrid_CreatingRow" LoadingRow="C1MasterGrid_LoadingRow" GroupChanged="C1MasterGrid_GroupChanged" LoadedRowDetailsPresenter="C1MasterGrid_LoadedRowDetailsPresenter" AutoGenerateColumns="True" FrozenColumnCount="0" RecycleRows="True" IsReadOnly="True" HeadersVisibility="All" RowHeaderWidth="15" GridLinesVisibility="Vertical" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Auto" VerticalGridLinesBrush="Aquamarine" HorizontalGridLinesBrush="Aqua"> <c1grid:C1DataGrid.RowDetailsTemplate> <DataTemplate> <c1grid:C1DataGrid x:Name="C1ChildGrid" CanUserGroup="False" CanUserFreezeColumns="False" CanUserAddRows="False" CanUserEditRows="False" CanUserFilter="False" CanUserRemoveRows="False" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserSort="False" CanUserToggleDetails="False" AutoGeneratingColumn="C1ChildGrid_AutoGeneratingColumn" AutoGenerateColumns="True" RecycleRows="True" IsReadOnly="True" HeadersVisibility="All" RowHeaderWidth="15" Margin="5" SelectedIndex="-1"> </c1grid:C1DataGrid> </DataTemplate> </c1grid:C1DataGrid.RowDetailsTemplate> </c1grid:C1DataGrid> </Grid> </c1Docking:C1DockTabItem></c1Docking:C1DockTabControl>
Brice Breeden Senior Software Engineer Impact Technologies briceb|at|impacttech.com
Hi, Brice.
The problem is that you have a newer C1.Silverlight.dll that is incompatible with your older C1.Silverlight.Docking.dll. Download a newer version of the later from http://helpcentral.componentone.com/cs/forums/p/81789/227203.aspx#227203 . We deeply regret this state of affairs and are rethinking our release by forum strategy.
Regards,Bruno
Hi Bruno,Thanks for the update. I was worried I'd have to rearchitect into asplit pane and tab control model. I'll download the patch and giveit a try.Have a few suggestions. Mentioned some before, and hope you canpass them on.I hope you guys keep the patches coming. This kind of customerservice is one of the reasons Impact purchased C1 products.However, I know this takes more development effort and tracking.I've noticed a few things:1) When I enter the Silverlight forum, there is only one pinned thread."XapOptimizer also shrinks its price"I don't know where I can see a list of bug fixes or patches.If you know, please make a pinned thread that explains it.2) When I posted this thread, you guys seemed to know where therelated thread was. But there is nothing to help the users find them.3) I suggest making a few more pinned threads within the Silverlightforum. Like one for "bug fixes" or "patches". Use it likea cross-reference. If you have no internal bug tracking tool, it shouldhelp you guys as well.When you post a patch on a thread, post it on the original thread asyou currently do. Then make another post on the pinned thread. All youhave to say on the pinned thread is something like:Patch (C1.Silverlight.dll)and indicate the customer's thread.Anytime a release occurs, those pinned threads are deleted. And youcreate new ones.
I downloaded that patch. However, my only patch is currently just the C1.Silverlight.Data.dll patch.
That patch contains a fix for a DataSet issue.
I'll check other issues within the forum for additional patches.
Hi Brice,Thanks again for your so valuable feedback.We are updgrading the forum software as well, so I will try to put take this things into account too.Regards
Follow me: Twitter.com/leovernazza/
Brice,
Send me an email to brunom@componentone.com so I can send you the latest set of assemblies.
Regards,
Thanks Bruno.....email sent from:
briceb|at|impacttech.com
I created a test app and I'm able to recreate the errors using it. Attaching to this thread. Use the slider to create new docking views.
I used this demo to reliably cause the exception:
My earlier posts describe issues in more detail.
Here are some observations I'll mention using the test app:
The root problem is that class DataSetDockTab is defined as a Xaml and code behind pair, which is only valid for UserControl. Silverlight gets mighty confused otherwise. Non-UserControl classes don't get assigned their own NameScope, so x:Name in the Xaml causes name collisions when several instances are used in the same parent scoped, as is the case here. Remove the x:Name attribute from the grid (you will have to comment a couple of lines from the code behind as well, but these don't affect the crash) to confirm this is the cause of the exception.
Change DataSetDockTab to a UserControl, so that it only represents the content of a C1DockTabItem. Then create the C1DockTabItem and the C1DockTabControl in code. Use C1DockControl.DockTabControlStyle to customize TabStripPlacement, TabItemShape, etc.. Note that this was needed anyway since new C1DockTabControl are sometimes automatically created when the user customizes the docking layout.
Let's hope this obscure problem was also the cause of the problems with ContextMenu. Tell me if not.
Bruno,
I didn't know this type of XAML implementation caused problems. Changing to UserControls is a major improvement. Consider this thread resolved.
However, ContextMenu is still an issue. When I have time, I'll post something explaining the two issues I've found. Along with some demo code.
Regarding XAML, I got the idea from the C1 Quick Start guide, for the C1Window example.
<c1:C1Window x:Class="QuickStart.MyWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c1="clr-namespace:C1.Silverlight;assembly=C1.Silverlight"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<TextBlock Text="We can put any control inside the window" />
</Grid>
</c1:C1Window>
I think this works in WPF. Silverlight has some ugly spots.
Thanks for bringing up the quickstart. We'll fix it.