How can I get notification of the changing of a value in a column of comboboxes within my datagrid

This solution is based off the combobox for datagrid columns found in this FAQ. That solution replaces the standard textbox with a combobox. To get notifications of the changes, a delegate is passed into the constructor for the custom column style. This delegate is called anytime the combobox value changes. It passes the row number and value as arguments. You can download sample code (C#, VB) that shows the implementation.

What should I do to make my StringCollection property editable during design-time?

Use this custom editor attribute for the property that is of the StringCollection type (this can be used for other Collection types too if you want to allow entry of strings into the collection during design-time). Editor(‘System.Windows.Forms.Design.StringCollectionEditor, System.Design’, ‘System.Drawing.Design.UITypeEditor, System.Drawing’), public YourCollection YourProp{get{…}set{…}} StringCollectionEditor is not public so you have to use the above constructor override and specify the typename. This editor should allow you to edit your collection without any problems.

How can I get celltips or tooltips to vary from cell to cell in my DataGrid

One way to do this is to use a ToolTip control and reset the control text as the mouse moves from cell to cell. Below is a derived DataGrid class that implements this idea. The main points are: Have members that track the current hitRow and hitCol where the mouse is. In a MouseMove handler, do a HitTest on the mouse location to see if there is a new hit cell. If so, set the hitRow & hitCol, and hook the tooltip to hold your text according to the cell. In our sample, we just display the string value of the grid cell. Finally, in the MouseMove handler, after setting a new text in the tooltip, set the tooltip active so it can show itself in due time. public class DataGridCellTips : DataGrid { private int hitRow; private int hitCol; private System.Windows.Forms.ToolTip toolTip1; public DataGridCellTips() { hitRow = -1; hitCol = -1; this.toolTip1 = new System.Windows.Forms.ToolTip(); this.toolTip1.InitialDelay = 1000; this.MouseMove += new MouseEventHandler(HandleMouseMove); } private void HandleMouseMove(object sender, MouseEventArgs e) { DataGrid.HitTestInfo hti = this.HitTest(new Point(e.X, e.Y)); if (hti.Type == DataGrid.HitTestType.Cell && (hti.Row != hitRow || hti.Column != hitCol)) { //new hit row hitRow = hti.Row; hitCol = hti.Column; if (this.toolTip1 != null && this.toolTip1.Active) this.toolTip1.Active = false; //turn it off this.toolTip1.SetToolTip(this, this[hitRow, hitCol].ToString()); this.toolTip1.Active = true; //make it active so it can show itself //Console.WriteLine(‘MouseMove ‘+ hitRow.ToString() + ‘ ‘ + hitCol.ToString()); } } }

How can I make my DataGrid support a single select mode, and not the default multiselect mode

One way to do this is to derive a DataGrid, override its OnMouseDown and OnMouseMove methods. In the OnMouseDown, handle selecting and unselecting in your code without calling the base class if the click is on the header. In the OnMouseMove, don’t call the baseclass to avoid dragging selections. Below is a code snippet for a sample derived DataGrid. You can download a full project (C#, VB). public class MyDataGrid : DataGrid { private int oldSelectedRow = -1; protected override void OnMouseMove(System.Windows.Forms.MouseEventArgs e) { //don’t call the base class if left mouse down if(e.Button != MouseButtons.Left) base.OnMouseMove(e); } protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e) { //don’t call the base class if in header DataGrid.HitTestInfo hti = this.HitTest(new Point(e.X, e.Y)); if(hti.Type == DataGrid.HitTestType.Cell) { if(oldSelectedRow > -1) this.UnSelect(oldSelectedRow); oldSelectedRow = -1; base.OnMouseDown(e); } else if(hti.Type == DataGrid.HitTestType.RowHeader) { if(oldSelectedRow > -1) this.UnSelect(oldSelectedRow); if((Control.ModifierKeys & Keys.Shift) == 0) base.OnMouseDown(e); else this.CurrentCell = new DataGridCell(hti.Row, hti.Column); this.Select(hti.Row); oldSelectedRow = hti.Row; } } }