当前位置: 澳门新濠3559 > 操作系统 > 正文

根据需求写出模板如下澳门新濠3559,显示行号

时间:2019-10-07 14:49来源:操作系统
说明 WPF DEV CellTemplateSelector(多少个正确利用DevExpress CellTemplateSelector的德姆o),wpfdevexpress 说明 笔者在等级次序中依据须求须要用到WPF DevCellTemplateSelector时,遭受多数坑。曾一度想要屏弃

说明

WPF DEV CellTemplateSelector(多少个正确利用DevExpress CellTemplateSelector的德姆o),wpfdevexpress

说明

笔者在等级次序中依据须求须要用到WPF Dev CellTemplateSelector时,遭受多数坑。曾一度想要屏弃行使模板转变器,但又心有不甘,终于在不断努力下,达到了要求的渴求。所以写下来和豪门享用。假设有同样郁结的人,能够少走些弯路。我第三遍写博客,文笔糟糕,还请见谅。

需求

澳门新濠3559 1

 

需要异常的粗略,选拔格局下拉框选中时控方法照旧价格调控情势,前面包车型地铁调整点单元格对应呈现日期控件或文本控件。

思路

刚获得这么些须要,就悟出了模版选用器。不过在此以前也不曾用过模板转变器,所以走了众多弯路。大家先看dev官方文书档案的表明

When using CellTemplate (or DataViewBase.CellTemplate) note the following:

To enable data editing, use an editor shipped with the DevExpress Data Editors Library for WPF. The editor's Name must be set to 'PART_Editor'.

When the editor's Name is set to PART_Editor, the grid automatically adjusts its appearance and synchronizes the editor with a source field specified by the FieldName or Binding properties.

Standard controls can be used in CellTemplate only for display purposes. Data editing is not allowed.

Templates specified via the DisplayTemplate and/or EditTemplate are ignored.

A column's in-place editor specified via EditSettings, is also ignored.

意思乃是模板控件必得命名叫“PART_Editor”,而且模板无需绑定数据源,对应的GridControl的列绑定数据源就可以,GridControl会自动将模板嵌入体现。小编刚起初便是未有命名规范,何况在模板控件中绑定了多少源所以展现一向有标题。依照供给写出模板如下。

  <Window.Resources>
        <DataTemplate x:Key="FirstTemplate">
            <StackPanel>
                <dxe:DateEdit x:Name="PART_Editor"  Mask="yyyy-MM-dd" MaskUseAsDisplayFormat="True">
                </dxe:DateEdit>
            </StackPanel>
        </DataTemplate>

        <DataTemplate x:Key="SecondTemplate">
            <StackPanel>
                <dxe:TextEdit x:Name="PART_Editor"
                              MaskType="Numeric" Mask="n" MaskUseAsDisplayFormat="True" AllowNullInput="False" >
                </dxe:TextEdit>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>

与此同期CellTemplateSelector必要继续DataTemplateSelector类,况且达成SelectTemplate方法依据条件重临四个您所需的Template.代码如下

 public  class SettingDataTemplateSelector: DataTemplateSelector
    {
        public DataTemplate FirstTemplate
        {
            get;
            set;
        }
        public DataTemplate SecondTemplate
        {
            get;
            set;
        }


        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            FrameworkElement element = container as FrameworkElement;

            EditGridCellData data = (EditGridCellData)item;
            Setting setting = data.RowData.Row as Setting;
            if (setting != null)
            {

                if (setting.ControlMode == 1)
                    return element.FindResource("FirstTemplate") as DataTemplate;
                else
                    return element.FindResource("SecondTemplate") as DataTemplate;
            }
            return base.SelectTemplate(item, container);
        }
    }

然后前台xmal的CellTemplateSelector中援用选取器,代码如下

      <dxg:GridColumn x:Name="ControlPointDataTime" Binding="{Binding Path=ControlPoint,Mode=TwoWay}" Header="控制点" >
                    <dxg:GridColumn.CellTemplateSelector>
                        <local:SettingDataTemplateSelector
                                                             FirstTemplate="{StaticResource FirstTemplate}"
                                                             SecondTemplate="{StaticResource SecondTemplate}" />
                    </dxg:GridColumn.CellTemplateSelector>

                </dxg:GridColumn>

主干的要求就到位了,是或不是望着相当的粗略。其实当你感到轻巧是因为您打探了DEV的一些机制,譬如模板控件的命名必得是“PART_Editor”,还会有绑定的地点,任何多个地方出错了前台运营显示都以不会顺畅的,这年你就能够找不到消除的格局,进而达不到你想要的目标。上边的需要实际上还或许有二个难题,举个例子:当你增多一条记下是金额调整的,此时那条记下已经加多到数据中了。借令你在分界面上修改将下拉框选中改为时控,后边一列由于因为非常小概转移为时间格式,所以显示仍然有标题。此时如何做呢,我想到了GridControl的CellValueChanged事件,当自家切换调整格局时,前边一列作者给它清空,那样直接让客户输入不就好了。在此处自身也将代码贴出来。

   private void ViewSimulate_CellValueChanged(object sender, CellValueChangedEventArgs e)
        {
            if (e.Column == ComControlMode)
            {
                ((GridControl) e.Source.DataControl).SetCellValue(e.RowHandle,ControlPointDataTime,null);
            }
        }

到此,项目运维起来看着勉强能够,固然必要很简短,但也折腾了本身一段时间,现在笔者会不断的写博客来记录自个儿遭受的坑来和豪门享用,同不常候也实惠自个儿要好查看。最终,笔者将全体的demo上传供我们参照他事他说加以考察,笔者用的dev的版本是15.2.4,假设您的本子和本人的分裂,能够将demo中的引用删除换到本人的就足以了。

补充:当系统时间设置如下时,前台界面将展示混乱。

澳门新濠3559 2

前台呈现如下

澳门新濠3559 3

当作者开采这一个难点,小编一世不曾越来越好的化解办法。前台模板DateEdit的Mask、DisplayFormatString以及MaskUseAsDisplayFormat都设为True。于是自个儿向DevSupport寻求协理。DevSupport给出解释如下:

The cause of the issue is that date values are stored as string values. In this scenario, DXGrid posts the values in the current culture to maintain end-user input. 
DateEdit editors, however, use an invariant culture to parse string values.
To resolve this issue, you can either store the date values as DateTime or additionally convert posted values. With your current implementation,
the second approach can be implemented by setting Binding.Converter to a custom converter

在此,小编付诸第三种艺术的落实格局。

public class ConvertDateTime : MarkupExtension, IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            DateTime date;
            if (value is string && DateTime.TryParse((string)value, out date))
                return date.ToString(CultureInfo.InvariantCulture);
            return value;
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return this;
        }
    }

前台增加Convert转化绑定

<dxg:GridColumn x:Name="ControlPointDataTime" Binding="{Binding Path=ControlPoint,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,NotifyOnSourceUpdated=True,Converter={local:ConvertDateTime}}" Header="控制点" >

到此,难点就缓慢解决了。

补充2:对于地方的切换调节方式时,前边一列清空的要求这里有更轻便的兑现方式,只供给将您自定义的类中的属性加上有的逻辑调节就好了,代码如下:

   private int _ControlMode;

        public int ControlMode
        {
            get { return _ControlMode; }
            set { _ControlMode = value;
                ControlPoint = null;
            }
        }

 将修改后的源码重新上传。

 源码下载:

DEV CellTemplateSelector(四个不错选取DevExpress CellTemplateSelector的德姆o),wpfdevexpress 表明小编在类型中依照供给供给用到WPF Dev CellTemplateSelector时,...

Gridcontrol设置

自家在品种中根据必要须要用到WPF Dev CellTemplateSelector时,蒙受不菲坑。曾一度想要放任行使模板调换器,但又心有不甘,终于在屡屡大力下,达到了要求的要求。所以写下去和大家享受。如若有同一纠葛的人,能够少走些弯路。我第四回写博客,文笔糟糕,还请见谅。

1: 拖进去的时候别拖到tabcontrol外边, 不然dock 停靠的时候,停靠错了地点. 

需求

2:去掉Drag a column header here to group..... 

澳门新濠3559 4

澳门新濠3559 5

 

ShowGroupPanel = False

须要很简单,接纳形式下拉框选中时间决定措施大概价格调节格局,前面包车型地铁调控点单元格对应展现日期控件或文本控件。

 tabcontrol 设置:

思路

澳门新濠3559 6展现关闭Logo

刚获得那一个须要,就悟出了模版选择器。然而以前也未曾用过模板调换器,所以走了广大弯路。大家先看dev官方文书档案的证实

3:tabcontrol 中不能够要保存贰个tabpage ,不然gridcontrol 拖进去 无控件能够承袭,导致错过.那样就不能在girdcontrol 控件里边可视化操作了.

When using CellTemplate (or DataViewBase.CellTemplate) note the following:

To enable data editing, use an editor shipped with the DevExpress Data Editors Library for WPF. The editor's Name must be set to 'PART_Editor'.

When the editor's Name is set to PART_Editor, the grid automatically adjusts its appearance and synchronizes the editor with a source field specified by the FieldName or Binding properties.

Standard controls can be used in CellTemplate only for display purposes. Data editing is not allowed.

Templates specified via the DisplayTemplate and/or EditTemplate are ignored.

A column's in-place editor specified via EditSettings, is also ignored.

4:显示tabpage页头

意思乃是模板控件必需命名称叫“PART_艾德itor”,而且模板不必要绑定数据源,对应的GridControl的列绑定数据源就可以,GridControl会自行将模板嵌入体现。笔者刚最早便是未有命名标准,并且在模板控件中绑定了数量源所以展现一直有标题。依照须求写出模板如下。

澳门新濠3559 7

  <Window.Resources>
        <DataTemplate x:Key="FirstTemplate">
            <StackPanel>
                <dxe:DateEdit x:Name="PART_Editor"  Mask="yyyy-MM-dd" MaskUseAsDisplayFormat="True">
                </dxe:DateEdit>
            </StackPanel>
        </DataTemplate>

        <DataTemplate x:Key="SecondTemplate">
            <StackPanel>
                <dxe:TextEdit x:Name="PART_Editor"
                              MaskType="Numeric" Mask="n" MaskUseAsDisplayFormat="True" AllowNullInput="False" >
                </dxe:TextEdit>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>

澳门新濠3559 8

再者CellTemplateSelector供给后续DataTemplateSelector类,何况实现SelectTemplate方法依照条件重回八个你所需的Template.代码如下

5:显示tabcontrol 不显示tab页头

 public  class SettingDataTemplateSelector: DataTemplateSelector
    {
        public DataTemplate FirstTemplate
        {
            get;
            set;
        }
        public DataTemplate SecondTemplate
        {
            get;
            set;
        }


        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            FrameworkElement element = container as FrameworkElement;

            EditGridCellData data = (EditGridCellData)item;
            Setting setting = data.RowData.Row as Setting;
            if (setting != null)
            {

                if (setting.ControlMode == 1)
                    return element.FindResource("FirstTemplate") as DataTemplate;
                else
                    return element.FindResource("SecondTemplate") as DataTemplate;
            }
            return base.SelectTemplate(item, container);
        }
    }
  // xtraTabControl1.ShowTabHeader=DevExpress.Utils.DefaultBoolean.False;
 xtraTabControl1.Visible = false;

然后前台xmal的CellTemplateSelector中引用选取器,代码如下

 6: 呈现行号

      <dxg:GridColumn x:Name="ControlPointDataTime" Binding="{Binding Path=ControlPoint,Mode=TwoWay}" Header="控制点" >
                    <dxg:GridColumn.CellTemplateSelector>
                        <local:SettingDataTemplateSelector
                                                             FirstTemplate="{StaticResource FirstTemplate}"
                                                             SecondTemplate="{StaticResource SecondTemplate}" />
                    </dxg:GridColumn.CellTemplateSelector>

                </dxg:GridColumn>
  this.gridView1.IndicatorWidth = 80;  //调整行号的框宽
  private void gridView1_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e)
        {
            if (e.Info.IsRowIndicator && e.RowHandle >= 0)
            {
                e.Info.DisplayText = (e.RowHandle   1).ToString();
            }
        }
添加customdrawrowindicator 事件

骨干的要求就完了了,是否望着很轻松。其实当你以为轻便是因为您询问了DEV的片段体制,比方模板控件的命名必得是“PART_Editor”,还会有绑定的地方,任何二个地点出错了前台运营突显都以不会顺畅的,这年你就能够找不到消除的主意,进而达不到你想要的目标。上边的须要实际上还会有三个主题素材,比方:当你增多一条记下是金额调节的,此时那条记下已经增加到数据中了。若是你在分界面上改变将下拉框选中改为时控,前面一列由于因为不能够转移为时间格式,所以展现依旧有毛病。此时怎么做呢,我想开了GridControl的CellValueChanged事件,当自家切换调控方法时,后边一列小编给它清空,那样平昔让顾客输入不就好了。在那边本人也将代码贴出来。

 7: 不显得列头:

   private void ViewSimulate_CellValueChanged(object sender, CellValueChangedEventArgs e)
        {
            if (e.Column == ComControlMode)
            {
                ((GridControl) e.Source.DataControl).SetCellValue(e.RowHandle,ControlPointDataTime,null);
            }
        }

澳门新濠3559 9

到此,项目运营起来瞧着勉强能够,固然要求很简短,但也折腾了自家一段时间,现在作者会不断的写博客来记录自个儿蒙受的坑来和豪门享受,同一时间也实惠自身要好查看。最终,作者将全部的demo上传供我们仿效,作者用的dev的版本是15.2.4,假诺你的本子和笔者的分歧等,能够将demo中的援用删除换来本人的就足以了。

澳门新濠3559 10

补充:当系统时间设置如下时,前台界面将显得混乱。

 

澳门新濠3559 11

 

前台呈现如下

 8:gridview 获 取某行的值 都是get早先的授命,  行内哪行被选了光标聚集,绿色色被选,就用比如

澳门新濠3559 12

  var a = gridView1.GetFocusedRow();  那么些是收获整个行的 内的数据.

当自家发觉这一个标题,小编不常未有更加好的消除办法。前台模板DateEdit的Mask、DisplayFormatString以及MaskUseAsDisplayFormat都设为True。于是自身向DevSupport寻求支持。DevSupport给出解释如下:

9: gridview 添加checkbox 选择

The cause of the issue is that date values are stored as string values. In this scenario, DXGrid posts the values in the current culture to maintain end-user input. 
DateEdit editors, however, use an invariant culture to parse string values.
To resolve this issue, you can either store the date values as DateTime or additionally convert posted values. With your current implementation,
the second approach can be implemented by setting Binding.Converter to a custom converter

增加一列,FieldName为 "check",将ColumnEdit 设置为 复选框 样式。gridview1editable设置为true

在此,作者付诸第三种方法的兑现格局。

  就要绑定的DataTable增多列 "check",Type 为 bool。

public class ConvertDateTime : MarkupExtension, IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            DateTime date;
            if (value is string && DateTime.TryParse((string)value, out date))
                return date.ToString(CultureInfo.InvariantCulture);
            return value;
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return this;
        }
    }

  绑定DataTable到GridControl。

前台增多Convert转化绑定

  获取: string value = gridview.GetDataRow(i)["check"].toString();

<dxg:GridColumn x:Name="ControlPointDataTime" Binding="{Binding Path=ControlPoint,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,NotifyOnSourceUpdated=True,Converter={local:ConvertDateTime}}" Header="控制点" >

         value == "true" ||  "" ("false")

到此,难题就化解了。

 设置为多选

补充2:对此地点的切换调控方法时,前面一列清空的必要这里有更简便易行的落到实处形式,只须要将你自定义的类中的属性加上部分逻辑调整就好了,代码如下:

   gridView1.OptionsSelection.MultiSelect = true;

   private int _ControlMode;

        public int ControlMode
        {
            get { return _ControlMode; }
            set { _ControlMode = value;
                ControlPoint = null;
            }
        }

   gridView1.OptionsSelection.MultiSelectMode = DevExpress.XtraGrid.Views.Grid.GridMultiSelectMode.RowSelect;

 将修改后的源码重新上传。

 10:清空gridview 内容   因为更新是基于数据源更新的,所以清空数据源,就吧gridview内的故事情节清空了.

 源码下载:

11绑定数据源

  static  BindingList<T> bl = new BindingList<T>();

 

附别的博客资料

1.掩蔽最上边的GroupPanel:

  gridView1.OptionsView.ShowGroupPanel=false; 

2.取妥帖前选定记录某字段的值:

  sValue=Table.Rows[gridView1.FocusedRowHandle][FieldName].ToString();  

3.数据只读:

  gridView1.OptionsBehavior.Editable=false;  

4.不显示MasterDetailView:

  gridView1.OptionsDetail.EnableMasterViewMode=false;  

5.更改最上面的GroupPanel内容:

   gridView1.GroupPanelText="柳生飘絮";  

6.设置数据源:

   gridControl1.DataSource = dt;

   绑定每一列的FiledName--属性

   对于Oracle数据库,全部的在设计器里写的主次中的字段名必得大写,不然只怕绑定不上字段,sqlserver未有这一个限制.  

7.读写拷贝权限设置:

  只读不可拷贝:

    ColumnViewOptionsBehavior.Editable = False  

  只读可拷贝:

    ColumnViewOptionsBehavior.Editable = True

    OptionsColumn.AllowEdit = True

    OptionsColumn.ReadOnly = True  

  可编辑:

    ColumnViewOptionsBehavior.Editable = True

    OptionsColumn.AllowEdit = True

    OptionsColumn.ReadOnly = False  

8.模板列的安装:

  到Columns中,在他的品质中找到ColumnEdit.

  以LookUpEdit为例:

  首先从Designer侧面菜单In-Place Editor Repository中增加LookUpEdit.取名字为Re1.然后.在她的Columns属性中拉长3列.Caption梯次为:编号,姓名,性别.FieldName依次为:FID,FNAME,FSEX.然后将Re1的NullText设置成空.

  AutoSearchColumnIndex属性设置为2.ImmediatePopup属性设置为True.

  SearchMode设置为OnlyInPopup.

  然后将这几个模板列附加到大家地点提到的列1(也正是将列1的ColumnEdit属性设成Re1)

  最终大家还要在代码里面给Re1绑定数据源和出示项.

         Re1.DataSource = DALUse.Query("select fid,fname,fsex from dual").Tables[0];

         Re1.DisplayMember = "FSEX";

         Re1.ValueMember = "FNAME";  

9.设某一列文字和标题局中浮现:

   gridView1.Columns[0].AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;

   gridView1.Columns[0].AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;   

10.去掉某一列上边的机关筛选功效(Filter):                  

   gridView1.Columns[0].OptionsFilter.AllowAutoFilter = false;

   gridView1.Columns[0].OptionsFilter.AllowFilter = false;                

   gridView1.Columns[0].OptionsFilter.ImmediateUpdateAutoFilter = false;   

11.设置冻结列(左冻结):

  gridView1.Columns[0].Fixed= DevExpress.XtraGrid.Columns.FixedStyle.Left;   

12.获得单元格数据(0行0列):

   string ss=gridView1.GetRowCellDisplayText(0, gridView1.Columns[0]);

   string ss = gridView1.GetRowCellValue(0, gridView1.Columns[0]);   

13.装置单元格数据(将0行0列的单元格赋值123):

   gridView1.SetRowCellValue(0, gridView1.Columns[0], "123");   

13.手动增添dev的列:

  DevExpress.XtraGrid.Columns.GridColumn Col1=new DevExpress.XtraGrid.Columns.GridColumn ();

  Col1.FieldName="FID";

  Col1.Visible=true;

  Col1.VisibleIndex=gridView1.Columns.Count;

  gridView1.Columns.Add(Col1);  

编辑:操作系统 本文来源:根据需求写出模板如下澳门新濠3559,显示行号

关键词: 澳门新濠3559