PC Review Forums Newsgroups Microsoft DotNet Microsoft Dot NET Framework Forms Hosting Custom Control in DataGridView

Reply

Hosting Custom Control in DataGridView

 
Thread Tools Rate Thread
Old 19-10-2005, 05:28 PM   #1
=?Utf-8?B?Uml0ZXNoIFRpam9yaXdhbGE=?=
Guest
 
Posts: n/a
Default Hosting Custom Control in DataGridView


Hi All,

I am trying to host a foreign control ( may be a usercontrol or some other
control
like a as tabcontrol ) as one of the columns of DataGridView.

As per my knowledge, I derived two classes:
DataGridViewUserControlColumn: DataGridViewColumn,
DataGridViewUserControlCell : DataGridViewCell

I have reached to a point where I can display the column on the DataGridView
and each cell has a usercontrol. But when I scroll the DataGridView, the
usercontrols
fail to scroll or change position. They remain where they are.

I am guessing that I haven't derived my two classes well ?
Any code sample will be of great help.

Below is my sample code that I was working around:

-----------------------------------------------------------------------------------------

using System;
using System.Windows.Forms;

public class CalendarColumn : DataGridViewColumn
{
public CalendarColumn()
: base()
{
}

public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
// Ensure that the cell used for the template is a CalendarCell.
if (value != null &&
!value.GetType().IsAssignableFrom(typeof(CalendarCell)))
{
throw new InvalidCastException("Must be a CalendarCell");
}
base.CellTemplate = value;
}
}
}

public class CalendarCell : DataGridViewTextBoxCell
{
private Button btn = new Button();
private static int counter = 0;
private int thisButtonCount;

public CalendarCell()
: base()
{
// Use the short date format.
this.Style.Format = "d";
counter++;
thisButtonCount = counter;

this.btn.Text = thisButtonCount.ToString();
}

public override void InitializeEditingControl(int rowIndex, object
initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
// Set the value of the editing control to the current cell value.
base.InitializeEditingControl(rowIndex, initialFormattedValue,
dataGridViewCellStyle);
CalendarEditingControl ctl =
DataGridView.EditingControl as CalendarEditingControl;
ctl.Value = (DateTime)this.Value;
}

protected override void Paint(System.Drawing.Graphics graphics,
System.Drawing.Rectangle clipBounds,
System.Drawing.Rectangle cellBounds, int rowIndex,
DataGridViewElementStates cellState,
object value, object formattedValue, string errorText,
DataGridViewCellStyle cellStyle,
DataGridViewAdvancedBorderStyle advancedBorderStyle,
DataGridViewPaintParts paintParts)
{
//throw new Exception("The method or operation is not implemented.");
base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState,
value, formattedValue, errorText, cellStyle,
advancedBorderStyle, paintParts);

btn.Size = cellBounds.Size;
btn.Location = cellBounds.Location;
this.DataGridView.Controls.Add(btn);
}

public Button GetControl
{
get { return btn; }
}
public override Type EditType
{
get
{
// Return the type of the editing contol that CalendarCell uses.
return typeof(CalendarEditingControl);
}
}

public override Type ValueType
{
get
{
// Return the type of the value that CalendarCell contains.
return typeof(DateTime);
}
}

public override object DefaultNewRowValue
{
get
{
// Use the current date and time as the default value.
return DateTime.Now;
}
}
}


class CalendarEditingControl : DateTimePicker, IDataGridViewEditingControl
{
DataGridView dataGridView;
private bool valueChanged = false;
int rowIndex;

public CalendarEditingControl()
{
this.Format = DateTimePickerFormat.Short;
}

// Implements the
IDataGridViewEditingControl.EditingControlFormattedValue
// property.
public object EditingControlFormattedValue
{
get
{
return this.Value.ToShortDateString();
}
set
{
String newValue = value as String;
if (newValue != null)
{
this.Value = DateTime.Parse(newValue);
}
}
}

// Implements the
// IDataGridViewEditingControl.GetEditingControlFormattedValue method.
public object GetEditingControlFormattedValue(
DataGridViewDataErrorContexts context)
{
return EditingControlFormattedValue;
}

// Implements the
// IDataGridViewEditingControl.ApplyCellStyleToEditingControl method.
public void ApplyCellStyleToEditingControl(
DataGridViewCellStyle dataGridViewCellStyle)
{
this.Font = dataGridViewCellStyle.Font;
this.CalendarForeColor = dataGridViewCellStyle.ForeColor;
this.CalendarMonthBackground = dataGridViewCellStyle.BackColor;
}

// Implements the IDataGridViewEditingControl.EditingControlRowIndex
// property.
public int EditingControlRowIndex
{
get
{
return rowIndex;
}
set
{
rowIndex = value;
}
}

// Implements the IDataGridViewEditingControl.EditingControlWantsInputKey
// method.
public bool EditingControlWantsInputKey(
Keys key, bool dataGridViewWantsInputKey)
{
// Let the DateTimePicker handle the keys listed.
switch (key & Keys.KeyCode)
{
case Keys.Left:
case Keys.Up:
case Keys.Down:
case Keys.Right:
case Keys.Home:
case Keys.End:
case Keys.PageDown:
case Keys.PageUp:
return true;
default:
return false;
}
}

// Implements the
IDataGridViewEditingControl.PrepareEditingControlForEdit
// method.
public void PrepareEditingControlForEdit(bool selectAll)
{
// No preparation needs to be done.
}

// Implements the IDataGridViewEditingControl
// .RepositionEditingControlOnValueChange property.
public bool RepositionEditingControlOnValueChange
{
get
{
return false;
}
}

// Implements the IDataGridViewEditingControl
// .EditingControlDataGridView property.
public DataGridView EditingControlDataGridView
{
get
{
return dataGridView;
}
set
{
dataGridView = value;
}
}

// Implements the IDataGridViewEditingControl
// .EditingControlValueChanged property.
public bool EditingControlValueChanged
{
get
{
return valueChanged;
}
set
{
valueChanged = value;
}
}

// Implements the IDataGridViewEditingControl
// .EditingPanelCursor property.
public Cursor EditingPanelCursor
{
get
{
return base.Cursor;
}
}

protected override void OnValueChanged(EventArgs eventargs)
{
// Notify the DataGridView that the contents of the cell
// have changed.
valueChanged = true;
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
base.OnValueChanged(eventargs);
}
}

public class Form1 : Form
{
private DataGridView dataGridView1 = new DataGridView();

[STAThreadAttribute()]
public static void Main()
{
Application.Run(new Form1());
}

public Form1()
{
this.dataGridView1.Dock = DockStyle.Fill;
this.Controls.Add(this.dataGridView1);
this.Load += new EventHandler(Form1_Load);
//this.dataGridView1.CellFormatting +=new
DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting);
this.Text = "DataGridView calendar column demo";
this.dataGridView1.AllowUserToAddRows = false;
}

//public void dataGridView1_CellFormatting(object sender,
DataGridViewCellFormattingEventArgs e)
//{

//}

private void Form1_Load(object sender, EventArgs e)
{
CalendarColumn col = new CalendarColumn();
CalendarCell cell = new CalendarCell();
col.CellTemplate = cell;

this.dataGridView1.Columns.Add(col);
this.dataGridView1.RowCount = 5;
foreach (DataGridViewRow row in this.dataGridView1.Rows)
{
row.Cells[0].Value = DateTime.Now;
}
}
}


----------------------------------------------------------------------------------------------

Below is the reference link for above code:


http://msdn2.microsoft.com/en-us/library/7tas5c80


Thanks..

  Reply With Quote
Reply



Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off