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

Custom RadListView (Button item)

5 Answers 609 Views
ListView
This is a migrated thread and some comments may be shown as answers.
Luca
Top achievements
Rank 1
Luca asked on 23 Aug 2015, 05:29 PM

Hello,

I've created a custom RadListView following this page: Custom Items | UI for WinForms

However when I click a ButtonElement in RadListView, the correspondent ListViewItem is selected. How can I avoid this?

See also "image.png".

Thanks in advance,

Luca Scalzotto

5 Answers, 1 is accepted

Sort by
0
Stefan
Telerik team
answered on 24 Aug 2015, 11:26 AM
Hello Luca,

Thank you for writing.

To prevent the change in the selection, in the MouseDown event of the button in the custom cell, you should set the control element Tag with some value, so later you would know whether the selection request comes from the button or not:
private void Button_MouseDown(object sender, MouseEventArgs e)
{
    this.RowElement.CellsContainer.Context.Tag = "ButtonIsClicked";
}

Then you should create a descendant of RadListView and override the OnMouseUp property and return if the Tag is filled with your value:
class MyRadListView : RadListView
{
    protected override void OnMouseUp(MouseEventArgs e)
    {
        if (this.ListViewElement.ViewElement.Tag + "" == "ButtonIsClicked")
        {
            this.ListViewElement.ViewElement.Tag = null;
            return;
        }
 
        base.OnMouseUp(e);
    }
 
    public override string ThemeClassName
    {
        get
        {
            return typeof(RadListView).FullName;
        }
    }
}

Here is a whole example you can test with:
protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
 
    radListView1 = new MyRadListView();
    radListView1.Parent = this;
    radListView1.Dock = DockStyle.Fill;
    radListView1.CellCreating += radListView1_CellCreating;
 
    radListView1.ViewType = ListViewType.DetailsView;
    DataTable dt = new DataTable();
    dt.Columns.Add("Id", typeof(int));
    dt.Columns.Add("Name", typeof(string));
 
    for (int i = 0; i < 50; i++)
    {
        dt.Rows.Add(i, "Item " + i);
    }
 
    this.radListView1.DataSource = dt;
}
 
private void radListView1_CellCreating(object sender, ListViewCellElementCreatingEventArgs e)
{
    DetailListViewDataCellElement cell = e.CellElement as DetailListViewDataCellElement;
    if (cell != null && cell.Data.Name == "Name")
    {
        e.CellElement = new CustomDetailListViewDataCellElement(cell.RowElement, e.CellElement.Data);
    }
}
 
class MyRadListView : RadListView
{
    protected override void OnMouseUp(MouseEventArgs e)
    {
        if (this.ListViewElement.ViewElement.Tag + "" == "ButtonIsClicked")
        {
            this.ListViewElement.ViewElement.Tag = null;
            return;
        }
 
        base.OnMouseUp(e);
    }
 
    public override string ThemeClassName
    {
        get
        {
            return typeof(RadListView).FullName;
        }
    }
}
 
 
public class CustomDetailListViewDataCellElement : DetailListViewDataCellElement
{
    private RadButtonElement button;
 
    public CustomDetailListViewDataCellElement(DetailListViewVisualItem owner,
        ListViewDetailColumn column) : base(owner, column)
    {
    }
 
    protected override void CreateChildElements()
    {
        base.CreateChildElements();
 
        this.button = new RadButtonElement();
        button.MouseDown += Button_MouseDown;
 
        this.Children.Add(this.button);
    }
 
    private void Button_MouseDown(object sender, MouseEventArgs e)
    {
        this.RowElement.CellsContainer.Context.Tag = "ButtonIsClicked";
    }
 
    protected override Type ThemeEffectiveType
    {
        get
        {
            return typeof(DetailListViewHeaderCellElement);
        }
    }
 
    public override void Synchronize()
    {
        base.Synchronize();
        this.Text = "";
        DataRowView rowView = this.Row.DataBoundItem as DataRowView;
        this.button.Text = rowView.Row["Name"].ToString();
    }
 
    public override bool IsCompatible(ListViewDetailColumn data, object context)
    {
        if (data.Name != "Name")
        {
            return false;
        }
        return base.IsCompatible(data, context);
    }
}

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

Regards,
Stefan
Telerik
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
0
Luca
Top achievements
Rank 1
answered on 24 Aug 2015, 10:04 PM

Hello Stefan,

I tried your code but Button does not show MouseUp event effect (the button remains 'pressed'). Is there the possibility to handle only Button events - MouseUp, MouseDown, ecc - (when I click on an item in listview that is not Button nothing happens, ListviewDataItem can't be selected).

Sorry for bad English,

Thanks in advance,

Luca Scalzotto

0
Stefan
Telerik team
answered on 25 Aug 2015, 11:06 AM
Hi Luca,

On my end the button does not remain clicked with the code I've provided. Do you have something additional? 

I am using the default theme, which theme are you using? Also, which version of the suite are you using?

Regards,
Stefan
Telerik
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
0
Luca
Top achievements
Rank 1
answered on 26 Aug 2015, 12:01 PM

Hi Stefan,

I was using Windows8 theme, version 2015.2.623.40. I resolved with this code:

 Private Sub MyRadListView1_VisualItemCreating(sender As Object, e As ListViewVisualItemCreatingEventArgs) Handles MyRadListView1.VisualItemCreating
        e.VisualItem.DrawBorder = False
        e.VisualItem.DrawFill = False
    End Sub

In this way, selection disappears, but I can still select RadButtonElement. Thank you very much for answers​.

Regards,

Luca Scalzotto

0
Stefan
Telerik team
answered on 27 Aug 2015, 11:40 AM
Hello,

I am glad you have solved this.

Just to mention that a more proper place to set these properties would be the CellFormatting event, not the VisualItemCreating.

Regards,
Stefan
Telerik
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
Tags
ListView
Asked by
Luca
Top achievements
Rank 1
Answers by
Stefan
Telerik team
Luca
Top achievements
Rank 1
Share this question
or