This is a migrated thread and some comments may be shown as answers.

Multiline RadListView

12 Answers 521 Views
ListView
This is a migrated thread and some comments may be shown as answers.
Amin
Top achievements
Rank 1
Amin asked on 08 Feb 2012, 11:47 AM
Hi,

I have a radlistview on my form with a datasource set and a displaymember set at designtime.

The problem is that my display member may be of varying lengths and may not fit into one line.  Is there anyway to make the radlistview display with a wordwrap when necessary i.e some items may be over one line, some over two and some may have even three lines.

Many thanks.

12 Answers, 1 is accepted

Sort by
0
Richard Slade
Top achievements
Rank 2
answered on 08 Feb 2012, 05:10 PM
Hello Amin,

You could use some HTML in your display data to break up the text onto different lines. For exmaple:
1: A quick class to hold some data
public class Person
{
    public Person(int id, string name, string description)
    {
        Id = id;
        Name = name;
        Description = description;
    }
 
    public int Id
    {
        get;
        set;
    }
 
    public string Name
    {
        get;
        set;
    }
 
    public string Description
    {
        get;
        set;
    }
}

and then add some data using this class to a listview

private void RadForm1_Load(object sender, EventArgs e)
{
    List<Person> people = new List<Person>();
    people.Add(new Person(1, "Richard", "<html>Does something.<br>I'm not sure what</html>"));
    people.Add(new Person(2, "Chris", "<html>He's the boss man.<br>He can do what he wants</html>"));
    people.Add(new Person(3, "Pete", "<html>Nothing, nada, zip, zero.<br>He does nothing<br>There's quite a long one here</html>"));
 
    this.radListView1.ViewType = ListViewType.ListView;
    this.radListView1.DataSource = people;
    this.radListView1.ValueMember = "Id";
    this.radListView1.DisplayMember = "Description";
 
    radListView1.AllowArbitraryItemHeight = true;  
}

Hope that helps, but let me know if you have further questions
Richard


0
Ivan Todorov
Telerik team
answered on 13 Feb 2012, 10:09 AM
Hello Amin,

Thank you for your question.

Richard's suggestion is correct and might help you in some cases. However, it has the limitation that you need to put the line breaks manually.

To enable real text wrapping you can use:
this.radListView1.AllowArbitraryItemHeight = true;
this.radListView1.ItemSize = new Size(this.radListView1.Width - 20, 0);
this.radListView1.VisualItemFormatting += new ListViewVisualItemEventHandler(radListView1_VisualItemFormatting);
 
void radListView1_VisualItemFormatting(object sender, ListViewVisualItemEventArgs e)
{
    e.VisualItem.TextWrap = true;
}

However, due to a small issue in the layout of RadListView, this will only work in IconView with the Q3 2011 SP1 version. The issue will be addressed with the upcoming release and you will be able to use this code with SimpleView also.

I hope you find this useful. Should you have any further questions, do not hesitate to contact us.

Kind regards,
Ivan Todorov
the Telerik team
Sharpen your .NET Ninja skills! Attend Q1 webinar week and get a chance to win a license! Book your seat now >>
0
Allen
Top achievements
Rank 1
answered on 29 Oct 2012, 09:14 AM
i tried this on details view, and it does not work. any solutions? if i try Richard's solution, my application will slow down. any alternatives? thanks!
0
Ivan Todorov
Telerik team
answered on 01 Nov 2012, 07:50 AM
Hello RHEA,

Thank you for writing.

When RadListView is in details view mode, it uses cell elements to display its data. Therefore, you should use the CellCreating event to allow the TextWrap:
this.radListView1.CellCreating += new ListViewCellElementCreatingEventHandler(radListView1_CellCreating);
this.radListView1.AllowArbitraryItemHeight = true;
 
void radListView1_CellCreating(object sender, ListViewCellElementCreatingEventArgs e)
{
    e.CellElement.TextWrap = true;
}

I hope this will help. Feel free to ask if you have any further questions.

All the best,
Ivan Todorov
the Telerik team
Q3’11 of RadControls for WinForms is available for download (see what's new). Get it today.
0
Hassan
Top achievements
Rank 1
answered on 13 Aug 2013, 11:54 PM
Hello Ivan (Admin),

I tried to implement but it didn't work for me. I just added a handler on form_new and introduced the event related to the handler.

Looking forward to hearing from you please.

Kind regards,

Hassan
0
Stefan
Telerik team
answered on 16 Aug 2013, 01:33 PM
Hi Hassan,

Thank you for writing.

This code seems to be working just fine on my end. Could you please provide a small sample demonstrating where the test wrapping does not behave as expected, so we can investigate the precise case and help you resolve it?

Thank in advance for your time and cooperation.
 
Regards,
Stefan
Telerik
TRY TELERIK'S NEWEST PRODUCT - EQATEC APPLICATION ANALYTICS for WINFORMS.
Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
Sign up for Free application insights >>
0
Hassan
Top achievements
Rank 1
answered on 19 Aug 2013, 02:29 AM
Hi Stefan,

Thanks for reply. Actually, I need to have textwarp (RadListView) in vb windows. I failed to trigger the event. I tried to implement the code into C# but again event hasn't been fired. Here is sample code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Telerik.WinControls.UI;

namespace ListViewTextWrap
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            
        }

        void radListView1_CellCreating(object sender, ListViewCellElementCreatingEventArgs e)
        {
            e.CellElement.TextWrap = true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.radListView1.CellCreating += new ListViewCellElementCreatingEventHandler(radListView1_CellCreating);
            this.radListView1.AllowArbitraryItemHeight = true;

            radListView1.Items.Add("abcd efgh ijkl mnop qrst uvwx yz abcd efgh ijkl mnop qrst uvwx yz abcd efgh ijkl mnop qrst uvwx yz");
            radListView1.Items.Add("aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii jjjj kkkk lllll mmmmmm");

        }
    }
}

Please give a me a solution in vb as well.

Thanks,

Hassan
0
Stefan
Telerik team
answered on 19 Aug 2013, 10:13 AM
Hello Hassan,

When the control is in DetaileView, you have to use the CellFormatting event to format the cells, while in the rest of the views, you have to use the VisualItemFormatting event. Attached you can find both C# and VB projects where both cases are handled. .

I hope this helps.

Regards,
Stefan
Telerik
TRY TELERIK'S NEWEST PRODUCT - EQATEC APPLICATION ANALYTICS for WINFORMS.
Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
Sign up for Free application insights >>
0
Hassan
Top achievements
Rank 1
answered on 20 Aug 2013, 03:56 AM
Hi Stefan,

Thanks for reply. I tried both c# and vb but again there was no luck with me. For your information I'm using .net 3.5 and Telerik version 2011.3.11.1219. Is there any other property I need to set for RadListView for this purpose?

It's really killing me.

Best regards,

Hassan
0
Hassan
Top achievements
Rank 1
answered on 21 Aug 2013, 03:43 AM
Hi Stefan,

Please help me with issue. And also please let me know is there any alternative?

Looking forward for you kind response.

Best regards,

Hassan
0
Stefan
Telerik team
answered on 22 Aug 2013, 03:11 PM
Hello Hassan,

Thank you for this clarification. Please note that unless there is specifically provided version in the forums we do test with the latest one and we do provide replied based on our investigations with the latest vesion.

Indeed, I can confirm that this code does not work with your version. However, with the very next version of the suite (2012.1.12.215) everything works as expected. 

To work around the issue in your version you need to create custom visual item as the following one:
public class CustomSimpleListViewVisualItem : BaseListViewVisualItem
 {
 
     protected override SizeF MeasureOverride(SizeF availableSize)
     {
         if (this.Data == null)
         {
             return SizeF.Empty;
         }
 
         if (this.dataItem.Owner.ShowCheckBoxes)
         {
             this.ToggleElement.Visibility = ElementVisibility.Visible;
         }
         else
         {
             this.ToggleElement.Visibility = ElementVisibility.Collapsed;
         }
 
         float indent = 0;
 
         if (this.Data.Owner.ShowGroups &&
         (this.Data.Owner.EnableCustomGrouping || this.Data.Owner.EnableGrouping) &&
         this.Data.Owner.Groups.Count > 0)
         {
             indent = this.Data.Owner.GroupIndent;
         }
 
         SizeF desiredSize = base.MeasureOverride(LayoutUtils.InfinitySize);
         desiredSize.Width += this.ToggleElement.DesiredSize.Width;
 
         if (this.Data.Size.Height > 0)
         {
             desiredSize.Height = this.Data.Size.Height;
         }
 
         if (this.Data.Size.Width > 0)
         {
             desiredSize.Width = this.Data.Size.Width;
         }
 
         RadListViewElement listViewElement = this.Data.Owner;
 
 
         if (listViewElement != null && !listViewElement.AllowArbitraryItemWidth)
         {
             desiredSize.Width = listViewElement.ItemSize.Width;
         }
 
         if (listViewElement != null && !listViewElement.AllowArbitraryItemHeight)
         {
             desiredSize.Height = listViewElement.ItemSize.Height;
         }
 
         if (listViewElement != null && listViewElement.AllowArbitraryItemHeight && !listViewElement.AllowArbitraryItemWidth)
         {
             SizeF measuredSize = base.MeasureOverride(new SizeF(desiredSize.Width, float.PositiveInfinity));
             desiredSize.Height = measuredSize.Height;
         }
 
         if (listViewElement != null && listViewElement.AllowArbitraryItemWidth && !listViewElement.AllowArbitraryItemHeight)
         {
             SizeF measuredSize = base.MeasureOverride(new SizeF(float.PositiveInfinity, desiredSize.Height));
             desiredSize.Width = measuredSize.Width;
         }
 
         if (listViewElement != null && listViewElement.FullRowSelect)
         {
             desiredSize.Width = Math.Max(float.IsInfinity(availableSize.Width) ? 0 : GetClientRectangle(availableSize).Width, desiredSize.Width + indent);
         }
 
         SizeF clientSize = GetClientRectangle(desiredSize).Size;
 
         RadItem editorElement = this.GetEditorElement(Editor);
 
         SizeF sizef = new SizeF(clientSize.Width - this.ToggleElement.DesiredSize.Width, clientSize.Height);
 
         if (IsInEditMode && editorElement != null)
         {
             float editorWidth = Math.Min(clientSize.Width - this.ToggleElement.DesiredSize.Width - indent, availableSize.Width - indent);
             editorElement.Measure(new SizeF(editorWidth, float.PositiveInfinity));
             desiredSize.Height = Math.Max(desiredSize.Height, editorElement.DesiredSize.Height);
             sizef.Height = desiredSize.Height;
         }
 
         this.layoutManagerPart.Measure(sizef);
         //this.Data.ActualSize = desiredSize.ToSize();
         PropertyInfo prop = this.Data.GetType().GetProperty("ActualSize");
         if (null != prop && prop.CanWrite)
         {
             prop.SetValue(this.Data, desiredSize.ToSize(), null);
         }
 
 
         return desiredSize;
     }
 
     protected override Type ThemeEffectiveType
     {
         get
         {
             return typeof(SimpleListViewVisualItem);
         }
     }
 }

To put this item in action, you should use the VisualItemCreating event:
void radListView1_VisualItemCreating(object sender, ListViewVisualItemCreatingEventArgs e)
{
    e.VisualItem = new CustomSimpleListViewVisualItem();
}

I hope this helps.
 
Regards,
Stefan
Telerik
TRY TELERIK'S NEWEST PRODUCT - EQATEC APPLICATION ANALYTICS for WINFORMS.
Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
Sign up for Free application insights >>
0
Hassan
Top achievements
Rank 1
answered on 23 Aug 2013, 03:53 AM
Hi Stefan,

At last it works for me. Thanks for your support.

Best regards,

Hassan
Tags
ListView
Asked by
Amin
Top achievements
Rank 1
Answers by
Richard Slade
Top achievements
Rank 2
Ivan Todorov
Telerik team
Allen
Top achievements
Rank 1
Hassan
Top achievements
Rank 1
Stefan
Telerik team
Share this question
or