NetAdvantage For .NET常见技术问题集锦(四)

15:如何得到嵌套表中各个Band绑定的Table

    DataSet ds = new DataSet();

            ds = (DataSet)this.ultraGrid1.DataSource;

            MessageBox.Show(ds.Tables[1].Rows[1][1].ToString());

            DataTable tableBand0 = new DataTable();

            tableBand0 = ds.Tables[0];

            DataTable tableBand1 = new DataTable();

            tableBand1 = ds.Tables[1];

//this.UltraChart1.LineChart

        //this.UltraChart1.Axis.X.RangeType = Infragistics.UltraChart.Shared.Styles.AxisRangeType.Custom;

        //this.UltraChart1.Axis.X.RangeMin = new DateTime(2007, 1, 01).Ticks;

 

        //this.UltraChart1.Axis.X.RangeMax = new DateTime(2007, 1, 31).Ticks;

 

        this.UltraChart1.Axis.X.TickmarkInterval = 1.00;

        this.UltraChart1.Axis.X.TickmarkStyle = Infragistics.UltraChart.Shared.Styles.AxisTickStyle.Smart;

        this.UltraChart1.Axis.X.TickmarkIntervalType = Infragistics.UltraChart.Shared.Styles.AxisIntervalType.Days;

        this.UltraChart1.Axis.X.Labels.ItemFormat = Infragistics.UltraChart.Shared.Styles.AxisItemLabelFormat.Custom;

        this.UltraChart1.Axis.X.Labels.ItemFormatString = "<ITEM_LABEL:yyyy-M-dd>";

 

16.通用的一些用于提高Grid性能的方法

1).对于Grid重绘:当运行时多个操作被执行时,Grid会部分或全部失效,这时需要重绘,如:检索所有行并对每个单元格值进行更新。

private void ultraButton1_Click(object sender, EventArgs e)

        {

            foreach (UltraGridRow row in this.ultraGrid1.Rows)

            {

                row.Cells["Price"].Value = (double)row.Cells["Price"].Value + 1.0;

            }

        }

在这种情况下您可以阻止表格进行多次重绘,而使用一次更新

private void ultraButton1_Click(object sender, EventArgs e)

        {

            this.ultraGrid1.BeginUpdate();

 

            try

            {

                foreach (UltraGridRow row in this.ultraGrid1.Rows)

                {

                    row.Cells["Price"].Value = (double)row.Cells["Price"].Value + 1.0;

                }

            }

            finally

            {

                this.ultraGrid1.EndUpdate();

            }

        }

另外一种情况,跟上面的情况类似:当表格的数据源发生改变的时候,大多数数据源会通知表格进行相关的改变或者进行一些处理,尽管很多处理是内在的,甚至不会进行重绘。在这种情况下,您可以通过使用SuspendRowSynchronization/ResumeRowSynchronization方法关掉内在处理来提高性能。

private void ultraButton1_Click(object sender, EventArgs e)

        {

            this.ultraGrid1.BeginUpdate();

            this.ultraGrid1.SuspendRowSynchronization();

 

            try

            {

                // Get the DataTable the grid is bound to. This assumes the

                // data source is a DataTable.

                DataTable dt = (DataTable)this.ultraGrid1.DataSource;

 

                foreach (DataRow row in dt.Rows)

                {

                    row["Price"] = (double)row["Price"] + 1.0;

                }

            }

            finally

            {

                this.ultraGrid1.ResumeRowSynchronization();

                this.ultraGrid1.EndUpdate();

            }

        }

2). CellDisplayStyle属性

默认情况下,每个单元格都有一个编辑器用于编辑和现实值,如:valuelists, color choosers, date dropdown, masking, checkboxes, buttons等,这些功能都是通过重载或者重绘得来。程序不知道程序在运行时需要哪一个功能,因此默认情况下,所有功能都是可用的,如果您知道每一列不使用哪一个功能,那么你就通过CellDisplayStyle属性来关闭某些功能,这样会在一定程度上提高表格的性能,具体怎么使用该属性,请参考控件提供的帮助文档。

3). ValueLists

   另外一个比较常见的导致Grid速度慢的问题是太多地不正确的使用ValueLists(包含:ValueList, BindableValueList, UltraCombo, UltraComboEditor,  UltraDropDown)

    ValueLists可以为某个单元格提供下拉列表的功能,要实现这个功能,表格会经常进行列表搜索,尤其是使用到DataValue/DisplayValue属性时,Grid需要把值转换显示为用户界面友好的文本。

    确保数据类型匹配:如果DataValue的值和DataType的值不一样,这样就会有几个原因导致性能问题:

首先:表格会转换值从一种数据类型到另外一种数据类型,其次:这些转换可能会导致异常,该异常会被表格截取并进行处理,这样会在性能方面有太多的损耗,所以一定要确保

DataValuesDataType的值一样。

    确保grid每个单元格的值存在list:另外一个容易犯的错误是grid的值不在list里,如:

grid里有一整数列,范围是1-100,现在假定把一个范围是1-100ValueList附加到该列,这样平均下来grid对每个单元格进行50次比较来找到匹配的元素并绘制,假定每个单元格值都是从0开始,这种情况下,每次单元格重绘之前都会对100个元素进行搜索以确定该元素是否存在与list,通过为list添加一个0值会减少损耗。

   二分检索:UltraDropDown具有二分检索功能,为了执行二分检索,DropDown控件必须在list里为DisplayValues保存内在的分类列表,这就意味着当一开始使用dropdown就会有一个小的性能开销,因为dropdown需要构建上面提到的列表,但是后面的每次搜索都会比线性搜索快,这样通过使用UltraDropDown以小的性能开销换来整个程序性能的大大提升,UltraDropDown控件拥有DropDownSearchMethod属性,默认值是Binary,当然你也可以设置为Linear

           EditAreaDisplayStyle属性:当附加UltraDropDown (或者 UltraCombo)到一个单元格并选择一个元素时,元素的外观会被拷贝到表格单元格,如果你有一个图片应用单元格,那么该图片将会出现在单元格里,要实现这些,DropDown会搜索整个list找出最大的图片并为该图片留下空间。这样搜索list会使表格绘制速度降低,因此在6.1版本以及以后,

        UltraDropDown控件添加了一个新的属性-EditAreaDisplayStyle,可以设置该属性为DisplayText,这样就显示地告诉DropDown不需要显示图片,如果您实际上单元格不需要显示图片时。

       递归

         UltraWinGrid为每一层创建一个CurrencyManager,如果绑定一个递归数据源,默认情况下会创建100CurrencyManagers100MaxBandDepth属性的默认值,数据源的每一层深度将会使CurrencyManager以对数级地增加,这样给表格造成了很多的系统消耗。

         解决这种情况的办法有两个:第一个

16.当行模板中使用WebDataChooser时出现选择年份,模板消失的问题。

   当使用下拉选择年份会关闭模板,是因为下拉框的区域并并没有包含在模板区域里,也就是说您是点击了模板区域以外的地方,导致了模板关闭。

  下面的代码是ComboX的解决办法,您把WebCombo1改为WebDateChoose控件就可以了,把WebCombo1.ClientID以及combo.container修改下就可以了。

function UltraWebGrid1_BeforeRowTemplateCloseHandler(gridName, rowId, bSaveChanges)
{
    var grid = igtbl_getGridById(gridName);
    var combo = igcmbo_getComboById("<%= WebCombo1.ClientID %>");
    var localEvent = (typeof(event)!='undefined') ? event : grid.event; 
    var localSrcElem = localEvent.srcElement ? localEvent.srcElement : localEvent.target;

    if (localEvent && localSrcElem && igtbl_contains(combo.container,localSrcElem))
        return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值