Hello,
I'm trying to create a custom GridViewMultiComboBoxColumn with additional features. When the grid autogenerate the columns depending the data type, I want that it autogenerates my customColumn if the type of the column's datasource is a related persistent class. Maybe it is not possible, but I want to try it.
Thanks in advance.
I'm trying to create a custom GridViewMultiComboBoxColumn with additional features. When the grid autogenerate the columns depending the data type, I want that it autogenerates my customColumn if the type of the column's datasource is a related persistent class. Maybe it is not possible, but I want to try it.
Thanks in advance.
4 Answers, 1 is accepted
0
Emanuel Varga
Top achievements
Rank 1
answered on 20 Nov 2010, 01:21 AM
Hello Ivan,
First i would like to apologize for the late answer.
Sadly i don't know of a way of changing the type for a column for a DataBoundGrid, but you could define all of your columns, and set the
Please take a look at the following example:
Hope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
Telerik WinForms MVP
First i would like to apologize for the late answer.
Sadly i don't know of a way of changing the type for a column for a DataBoundGrid, but you could define all of your columns, and set the
radGridView1.AutoGenerateColumns = false;Please take a look at the following example:
using System;using System.ComponentModel;using System.Windows.Forms;using Telerik.WinControls.UI;public partial class Form1 : Form{ private RadGridView radGridView1; public Form1() { InitializeComponent(); this.Controls.Add(radGridView1 = new RadGridView()); radGridView1.Dock = DockStyle.Fill; } protected override void OnLoad(EventArgs e) { base.OnLoad(e); var column1 = new GridViewDecimalColumn("Id"); radGridView1.Columns.Add(column1); var column2 = new GridViewMultiComboBoxColumn("BuyerId"); column2.DataSource = new BuyersCollection(10, 10); column2.ValueMember = "Id"; radGridView1.Columns.Add(column2); radGridView1.AutoGenerateColumns = false; this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; this.radGridView1.DataSource = new ProductsCollection(1000); }}#region Helperspublic class Product : INotifyPropertyChanged{ private int id, buyerId; public int BuyerId { get { return buyerId; } set { buyerId = value; OnPropertyChanged("BuyerId"); } } public int Id { get { return id; } set { id = value; OnPropertyChanged("Id"); } } public Product(int id, int buyerId) { this.Id = id; this.BuyerId = buyerId; } private void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } public event PropertyChangedEventHandler PropertyChanged;}public class Buyer{ public int Id { get; set; } public string Name { get; set; } public Buyer(int id, string name) { this.Id = id; this.Name = name; }}public class ProductsCollection : BindingList<Product>{ public ProductsCollection(int noItems) { for (int i = 0; i < noItems; i++) { this.Add(new Product(i, i + 10)); } }}public class BuyersCollection : BindingList<Buyer>{ public BuyersCollection(int startIndex, int lenght) { for (int i = 0; i < 10; i++) { this.Add(new Buyer(i + 10, "Buyer" + (i + 1))); } }}#endregion HelpersHope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
Telerik WinForms MVP
0
Tajes
Top achievements
Rank 1
answered on 21 Nov 2010, 07:15 PM
Thank you for your reply, Emanuel,
I already knew this solution, but I was looking for a way to autogenerate the column with my own column class.
Thank you anyway.
Greetings, Ivan
I already knew this solution, but I was looking for a way to autogenerate the column with my own column class.
Thank you anyway.
Greetings, Ivan
0
Accepted
Emanuel Varga
Top achievements
Rank 1
answered on 22 Nov 2010, 12:40 AM
Hello again,
Sorry, this is done internally, the best you could do is to use a CustomCellProvider in order to use custom cells for a specific column, but this will not change the type of the column.
If you are interested in using this, please take a look at the following example:
Hope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
Telerik WinForms MVP
Sorry, this is done internally, the best you could do is to use a CustomCellProvider in order to use custom cells for a specific column, but this will not change the type of the column.
If you are interested in using this, please take a look at the following example:
namespace TestCustomCellWProvider{ using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using Telerik.WinControls.UI; public partial class Form1 : Form { private RadGridView radGridView1; public Form1() { InitializeComponent(); this.Size = new Size(500, 400); this.Load += new EventHandler(Form1_Load); } void Form1_Load(object sender, EventArgs e) { radGridView1 = new RadGridView(); radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; radGridView1.Dock = DockStyle.Fill; this.radGridView1.TableElement.CellElementProvider = new CustomCellProvider(this.radGridView1.TableElement); this.Controls.Add(radGridView1); radGridView1.DataSource = new TestsCollection(1000); } } #region Helpers internal class Test { public int Id { get; set; } public string OtherColumn { get; set; } public string CustomColumn { get; set; } public Test(int id, string otherColumn, string customColumn) { this.Id = id; this.OtherColumn = otherColumn; this.CustomColumn = customColumn; } } internal class TestsCollection : BindingList<Test> { public TestsCollection(int noItems) { for (int i = 0; i < noItems; i++) { this.Add(new Test(i, "item" + i, i.ToString())); } } } #endregion Helpers #region Custom Cell Provider & Custom Cell public class CustomCellProvider : CellElementProvider { public CustomCellProvider(GridTableElement tableElement) : base(tableElement) { } public override IVirtualizedElement<GridViewColumn> CreateElement(GridViewColumn data, object context) { var dataRow = context as GridDataRowElement; if (data.Name == "CustomColumn" && dataRow != null) { var cell = new CustomCell(data, dataRow); return cell; } return base.CreateElement(data, context); } public override bool IsCompatible( IVirtualizedElement<GridViewColumn> element, GridViewColumn data, object context) { if (data.Name == "CustomColumn" && context is GridDataRowElement) { return element is CustomCell; } if (element is CustomCell) { return false; } return base.IsCompatible(element, data, context); } } public class CustomCell : GridDataCellElement { protected override Type ThemeEffectiveType { get { return typeof(GridDataCellElement); } } public RadButtonElement Button1Element { get; set; } public RadButtonElement Button2Element { get; set; } public CustomCell(GridViewColumn column, GridRowElement row) : base(column, row) { } protected override void CreateChildElements() { var button1 = new RadButtonElement(); button1.Text = "Button1"; button1.Margin = new Padding(0, 2, 0, 0); button1.MinSize = new Size(20, 20); button1.ImageAlignment = ContentAlignment.MiddleCenter; button1.Click += new EventHandler(button1_Click); Button1Element = button1; var button2 = new RadButtonElement(); button2.Text = "Button2"; button2.Margin = new Padding(0, 2, 0, 0); button2.MinSize = new Size(20, 20); button2.ImageAlignment = ContentAlignment.MiddleCenter; button2.Click += new EventHandler(button2_Click); Button2Element = button2; this.Children.Add(button1); this.Children.Add(button2); this.CreateTextParams(); base.CreateChildElements(); } void button2_Click(object sender, EventArgs e) { MessageBox.Show("Button2 pressed"); } void button1_Click(object sender, EventArgs e) { MessageBox.Show("Button1 pressed"); } /// <summary> /// Sets the actual text of the cell. /// </summary> /// <param name="value"></param> protected override void SetContentCore(object value) { if (this.Value != null && this.Value != DBNull.Value) { if (value.ToString() == "77" || value.ToString() == "1" || value.ToString() == "3") { Button1Element.Visibility = Telerik.WinControls.ElementVisibility.Hidden; Button2Element.Text = "Button2:" + value; } else { Button1Element.Visibility = Telerik.WinControls.ElementVisibility.Visible; Button1Element.Text = "Button1:" + value; Button2Element.Text = "Button2:" + value; } } } protected override SizeF ArrangeOverride(SizeF finalSize) { if (this.Children.Count == 2) { this.Children[0].Arrange( new RectangleF( 0, (finalSize.Height / 2) - (this.Children[0].DesiredSize.Height / 2 + 1), finalSize.Width / 2 - 1, this.Children[0].DesiredSize.Height)); this.Children[1].Arrange( new RectangleF(finalSize.Width / 2 + 1, (finalSize.Height / 2) - (this.Children[0].DesiredSize.Height / 2 + 1), finalSize.Width / 2 - 1, this.Children[1].DesiredSize.Height)); } this.UpdateInfo(); return finalSize; } } #endregion Custom Cell Provider & Custom Cell}Hope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
Telerik WinForms MVP
0
Tajes
Top achievements
Rank 1
answered on 22 Nov 2010, 10:20 AM
Thank you so much Emanuel. This is very helpfull