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