Winforms 使用progressbar创建自定义单元格元素时,RadListView具有奇怪的行为

Winforms 使用progressbar创建自定义单元格元素时,RadListView具有奇怪的行为,winforms,telerik,Winforms,Telerik,当我需要在listview的单元格中创建进度条时,我遇到了WinForms的RadListView的一个非常奇怪的行为。它最初创建带有进度条的单元格,但当我向左和向右滚动listview时,进度条元素会向左移动一列 以下是我插入“创建进度条单元格”的代码: _processingList = new RadListView(); _processingList.CellCreating += new ListViewCellElementCreatingEventHandler(_list_Ce

当我需要在listview的单元格中创建进度条时,我遇到了WinForms的RadListView的一个非常奇怪的行为。它最初创建带有进度条的单元格,但当我向左和向右滚动listview时,进度条元素会向左移动一列

以下是我插入“创建进度条单元格”的代码:

_processingList = new RadListView();
_processingList.CellCreating += new ListViewCellElementCreatingEventHandler(_list_CellCreating);
_processingList.ViewType = ListViewType.DetailsView;
_processingList.Dock = System.Windows.Forms.DockStyle.Fill;
_processingList.HeaderHeight = 16;
_processingList.Columns.Add("Source");
_processingList.Columns.Add("Dir");
_processingList.Columns.Add("Destination");
_processingListProgressColumn = new ListViewDetailColumn("Progress", "");
_processingList.Columns.Add(_processingListProgressColumn);
_processingList.Columns.Add("Size");
_processingList.Columns.Add("Priority");
_processingList.Columns.Add("Status");
_processingList.Columns.Add("Start Time");
_processingList.Columns.Add("Elapsed");
_processingList.Columns.Add("Left");

...

void _list_CellCreating(object sender, ListViewCellElementCreatingEventArgs e)
{
    DetailListViewDataCellElement dataCell = e.CellElement as DetailListViewDataCellElement;

    if (dataCell != null && dataCell.Data == _processingListProgressColumn)
    {
        e.CellElement = new ProgressBarCellElement(dataCell.RowElement, dataCell.Data);
    }
}

class ProgressBarCellElement : DetailListViewDataCellElement
{
    private RadProgressBarElement progressBar;

    public ProgressBarCellElement(DetailListViewVisualItem owner, ListViewDetailColumn column)
        : base(owner, column)
    {

    }

    protected override void CreateChildElements()
    {
        base.CreateChildElements();

        this.progressBar = new RadProgressBarElement();
        this.progressBar.StretchHorizontally = this.progressBar.StretchVertically = true;

        this.Children.Add(this.progressBar);
    }

    public override void Synchronize()
    {

        base.Synchronize();
        this.Text = "";

        try
        {
            this.progressBar.Value1 = Convert.ToInt32(this.Row[this.column]);
        }
        catch { }

    }

    protected override Type ThemeEffectiveType
    {
        get
        {
            return base.ThemeEffectiveType;
        }
    }
}
有人能给我一个很好的解释,或者告诉我如何在某些单元格中使用ProgressBar创建RadListView的正确方法吗?

在详细信息视图中对其单元格使用虚拟化,因此单元格在滚动等操作中被重用。要处理这种情况,应首先指定单元格应使用的列,并且还应为其余情况设置默认单元格。下面是一个完整的示例:

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        InitializeComponent();

        radListView1 = new RadListView();
        radListView1.Parent = this;
        this.Controls.SetChildIndex(radListView1, 0);
        radListView1.CellCreating += new ListViewCellElementCreatingEventHandler(_list_CellCreating);
        radListView1.ViewType = ListViewType.DetailsView;
        radListView1.Dock = System.Windows.Forms.DockStyle.Fill;
        radListView1.HeaderHeight = 16;
        radListView1.Columns.Add("Source");
        radListView1.Columns.Add("Dir");
        radListView1.Columns.Add("Destination");
        _processingListProgressColumn = new ListViewDetailColumn("Progress", "");
        radListView1.Columns.Add(_processingListProgressColumn);
        radListView1.Columns.Add("Size");
        radListView1.Columns.Add("Priority");
        radListView1.Columns.Add("Status");
        radListView1.Columns.Add("Start Time");
        radListView1.Columns.Add("Elapsed");
        radListView1.Columns.Add("Left");

        for (int i = 0; i < 60; i++)
        {
            radListView1.Items.Add("src", "dir", "dest", i * 1.14, "123", "high", "stat", "start", "elapsed", "left");
        }
    }

    ListViewDetailColumn _processingListProgressColumn;

    private void _list_CellCreating(object sender, ListViewCellElementCreatingEventArgs e)
    {
        DetailListViewDataCellElement dataCell = e.CellElement as DetailListViewDataCellElement;

        if (dataCell != null)
        {
            if (dataCell.Data == _processingListProgressColumn)
            {
                e.CellElement = new ProgressBarCellElement(dataCell.RowElement, dataCell.Data);
            }
            else
            {
                e.CellElement = new DefaultCellElement(dataCell.RowElement, dataCell.Data);
            }
        }
    }

    class DefaultCellElement : DetailListViewDataCellElement
    {
        public DefaultCellElement(DetailListViewVisualItem owner, ListViewDetailColumn column) :
            base(owner, column)
        {

        }
        public override bool IsCompatible(ListViewDetailColumn data, object context)
        {
            return data.Name != "Progress";
        }

        protected override Type ThemeEffectiveType
        {
            get
            {
                return base.ThemeEffectiveType;
            }
        }
    }

    class ProgressBarCellElement : DetailListViewDataCellElement
    {
        private RadProgressBarElement progressBar;

        public ProgressBarCellElement(DetailListViewVisualItem owner, ListViewDetailColumn column)
            : base(owner, column)
        {

        }

        public override bool IsCompatible(ListViewDetailColumn data, object context)
        {
            return data.Name == "Progress";
        }

        protected override void CreateChildElements()
        {
            base.CreateChildElements();

            this.progressBar = new RadProgressBarElement();
            this.progressBar.StretchHorizontally = this.progressBar.StretchVertically = true;

            this.Children.Add(this.progressBar);
        }

        public override void Synchronize()
        {

            base.Synchronize();
            this.Text = "";

            try
            {
                this.progressBar.Value1 = Convert.ToInt32(this.Row[this.column]);
            }
            catch { }

        }

        protected override Type ThemeEffectiveType
        {
            get
            {
                return base.ThemeEffectiveType;
            }
        }
    }