Сохраните данные в элементе управления сеткой dev express в XML и сохраните в поле базы данных varchar (max) - PullRequest
0 голосов
/ 02 августа 2020

У меня есть проект, который может динамически настраивать код XAML для создания динамических форм c. Итак, что мне нужно сделать, так это сгенерировать динамическую c сетку (динамическую c строки и столбцы) внутри такой настраиваемой формы динамической c. Я следовал приведенной ниже процедуре и столкнулся с указанной ниже проблемой. Кто-нибудь может, пожалуйста Помогите? Я получаю dynobjects через список, где dynobjects уже были перечислены в базе данных.

    My View.xaml.cs is as follows.
    
   

     private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
        {
        if (!loaded)
        {
        DynDataFormViewModel viewModel = ((DynDataFormViewModel)this.DataContext);
        MyExpando expando = null;
        DynForm dynForm = GetDynamicFormByID(viewModel.Entity.DynFormId);
        foreach (var item in dynForm.DynObjects)
        {
        if (item.DataType == DataType.Grid)
        {
        List<DynObject> dynObjectList = dynForm.DynObjects.Where(x => x.DynFormId == dynForm.Id).ToList();
        
        List<DynObject> dynObjectList1 = new List<DynObject>(dynObjectList.Where(a => a.DataType != DataType.Grid)).ToList();
        
        IDictionary<string, object> dict;
        //var lookup = DataModel.Source.ToLookup(t => t.Item);
        
        foreach (var ob in dynObjectList1)
        {
        dynamic row = new ExpandoObject();
        
        //row.Id = int.Parse(ob.Name.Replace("Item", ""));
        //row.Name = ob.Key;
        row.Id = 1;
        
        dict = row;
        
        item.Rows.Add(row);
        }
        
        dict = item.Rows[0];
        item.Columns = new List<Column>
        {
        
        };
        
        foreach (var subitem in dynObjectList.ToList())
        {
        
        string maskVal = null;
        
        if (subitem.DataType == DataType.Text)
        {
        maskVal = "A";
        item.Columns.Add(new Column(subitem.Name, subitem.Name, FieldTypes.String, maskVal));
        }
        else if (subitem.DataType == DataType.Boolean)
        {
        
        item.Columns.Add(new Column(subitem.Name, subitem.Name, FieldTypes.Bool, maskVal));
        }
        else if (subitem.DataType == DataType.Date)
        {
        maskVal = "d";
        item.Columns.Add(new Column(subitem.Name, subitem.Name, FieldTypes.Date, maskVal));
        
        }
        else if (subitem.DataType == DataType.Double)
        {
        maskVal = "f";
        item.Columns.Add(new Column(subitem.Name, subitem.Name, FieldTypes.Decimal, maskVal));
        }
        
        }
        for (var i = 0; i < item.Columns.Count; i++)
        {
        if (dict.ContainsKey(item.Columns[i].FieldName)) continue;
        
        dict.Add(item.Columns[i].FieldName, string.Empty);
        }
        }
        }
        
        I have a converter.cs calss as below.
        public class FieldTypeToEditSettingsConverter : MarkupExtension, IValueConverter
        {
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
        return this;
        }
        
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
        if (value == null) return null;
        
        var column = (Column)value;
        
        object editor;
        
        switch (column.FieldType)
        {
        case FieldTypes.String:
        editor = new TextEditSettings { Mask = column.Mask, MaskUseAsDisplayFormat = true };
        break;
        
        case FieldTypes.Int:
        case FieldTypes.Decimal:
        editor = new SpinEditSettings { Mask = column.Mask, MaskUseAsDisplayFormat = true };
        break;
        
        case FieldTypes.Date:
        editor = new DateEditSettings { Mask = column.Mask, MaskUseAsDisplayFormat = true };
        break;
        
        case FieldTypes.Bool:
        editor = new CheckEditSettings { IsThreeState = false, NullValue = false };
        break;
        
        default:
        throw new ArgumentOutOfRangeException();
        }
        
        return editor;
        }
        
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
        throw new NotImplementedException();
        }
        }
        
    ** My configuarable xaml code is as follows.**
<UserControl x:Class="System.Windows.Controls.UserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:dxb="http://schemas.devexpress.com/winfx/2008/xaml/bars"
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol"
xmlns:dxr="http://schemas.devexpress.com/winfx/2008/xaml/ribbon"
xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
xmlns:views="clr-namespace:ProjectName.WpfUI.Views;assembly=ProjectName.WpfUI"
xmlns:Common="clr-namespace:ProjectName.WpfUI.Converters;assembly=ProjectName.WpfUI"
xmlns:dxci="http://schemas.devexpress.com/winfx/2008/xaml/core/internal"
mc:Ignorable="d" d:DesignHeight="500" d:DesignWidth="500">

<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="…/…/Resources/MyConverters.xaml"/>
<ResourceDictionary Source="…/…/Resources/MyContextStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Common:FieldTypeToEditSettingsConverter x:Key="FieldTypeToEditSettingsConverter" />

<Style TargetType="{x:Type dxg:GridControl}">
<Setter Property="AutoGenerateColumns" Value="None"/>
<Setter Property="EnableSmartColumnsGeneration" Value="True"/>
<Setter Property="ColumnGeneratorTemplate">
<Setter.Value>
<DataTemplate>
<ContentControl>
<dxg:GridColumn FieldName="{Binding (dxci:DependencyObjectExtensions.DataContext).FieldName, RelativeSource={RelativeSource Self}}"
Header="{Binding (dxci:DependencyObjectExtensions.DataContext).Header, RelativeSource={RelativeSource Self}}"
EditSettings="{Binding ., Converter={StaticResource FieldTypeToEditSettingsConverter}}"/>
</ContentControl>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="ColumnGeneratorStyle">
<Setter.Value>
<Style TargetType="{x:Type dxg:GridColumn}">
<Setter Property="FilterPopupMode" Value="CheckedList"/>
</Style>
</Setter.Value>
</Setter>
</Style>

<Style TargetType="{x:Type dxg:TableView}">
<Setter Property="ShowGroupPanel" Value="False"/>
<Setter Property="ShowTotalSummary" Value="False"/>
<Setter Property="NavigationStyle" Value="Row"/>
<Setter Property="AutoWidth" Value="True"/>
</Style>

</ResourceDictionary>
</UserControl.Resources>
<DockPanel LastChildFill="True" >
<dxr:RibbonControl DockPanel.Dock="Top" RibbonStyle="Office2007" ToolbarShowMode="Hide">
dxr:RibbonControl.ToolbarItems
<dxb:BarButtonItem Content="BarButtonItem"/>
</dxr:RibbonControl.ToolbarItems>
<dxr:RibbonDefaultPageCategory Caption="Default Category">

</dxr:RibbonDefaultPageCategory>

</dxr:RibbonControl>
<dxr:RibbonStatusBarControl DockPanel.Dock="Bottom" >
dxr:RibbonStatusBarControl.LeftItems
<dxb:BarStaticItem Content="{Binding NumberOfValidationErrors, StringFormat=Number of Validation Errors: {0}}"/>
dxb:BarItemSeparator/
<dxb:BarStaticItem Content="{Binding IsValid, StringFormat=Form Validity: {0}}"/>
dxb:BarItemSeparator/
<dxb:BarStaticItem Content="{Binding ErrorFieldList, StringFormat=Error Fields{0}}"/>
</dxr:RibbonStatusBarControl.LeftItems>
</dxr:RibbonStatusBarControl>
<dxlc:LayoutGroup Orientation="Vertical" View="Group" Padding="5">
<dxlc:LayoutGroup Header="Group1" View="GroupBox" ItemLabelsAlignment="Local" Orientation="Vertical">
dxlc:LayoutGroup
<Grid>
<dxg:GridControl Name="TestGrid1" MaxHeight="500" DataContext="{Binding DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=dxlc:LayoutGroup}}" ColumnsSource="{Binding TestGrid1.Columns}" ItemsSource="{Binding TestGrid1.Rows}" >

dxg:GridControl.Columns

</dxg:GridControl.Columns>

dxg:GridControl.View
<dxg:TableView Name="tableView1"
AutoWidth="True"
NavigationStyle="Cell"
NewItemRowPosition="Top"
AllowEditing="True"
ShowDataNavigator="True" > </dxg:TableView>

</dxg:GridControl.View>
</dxg:GridControl>
</Grid>

</dxlc:LayoutGroup>

    The outcome is as follows(attached png)
    Clipboard-File-1.png
    [enter image description here][enter image description here][1][2]

Примечание: этот XAML - это настраиваемый код через интерфейс времени выполнения. Это не XAML-код представления. Я собирался создать набор строк и столбцов в соответствии со списком динамических c объектов, которые я раньше хранил в таблице базы данных.

Кто-нибудь может предложить способ сохранения этих данных сетки в файл XML, который можно сохранить в поле базы данных varchar (max) ?? Я не смог добиться успеха с некоторыми ссылками. Мне также нужно снова получить данные / загрузить сохраненные данные в сетку.

Я использовал приведенный ниже код, но кнопка сохранения не активируется при обновлении значения ячейки

private ObservableCollection<ExpandoObject> _rows { get; set; }
[NotMapped]
public ObservableCollection<ExpandoObject> Rows {
get { return _rows; }
set { _rows = value;NotifyPropertyChanged("Rows"); }
}  

      [1]: https://i.stack.imgur.com/TP1FQ.png
      [2]: https://i.stack.imgur.com/czNSr.png
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...