Its possible that some of my class members will not be initialized when one of my virtual members gets called even before the constructor. How can I avoid this?
If possible, initialize them in-line: public class MyClass { public ArrayList myArrayList = new ArrayList(); public MyClass(){} public override void MyOverride() { // When this gets called by the base class constructor, myArrayList will be initialized. } }
I have a derived DataGridColumnStyle. From within my Paint override, how can I get at other values in the DataGrid
You can get a reference to the DataGrid with code such as: Dim grid As DataGrid = Me.DataGridTableStyle.DataGrid Once you have the grid, you can use an indexer to get the value of any particular column on the same row. Dim someValue as Object = grid(rowNum, 5) ’ value in column 5….
How can I tell whether a scrollbar is visible in my DataGrid is visible
If you are using a derived DataGrid, then you can check the Visible property on the protected VertScrollBar property of DataGrid. So, you could check Me.VertScrollBar.Visible from within your derived DataGrid. To check it without access to the protected scrollbar properties is a little more work, but possible. One technique is to loop through the Controls property of the DataGrid looking for the scrollbar, and then checking its visible property at that time. [C#] //sample usage bool vSrollBarVisible = this.IsScrollBarVisible(this.dataGrid1); ….. private bool IsScrollBarVisible(Control aControl) { foreach(Control c in aControl.Controls) { if (c.GetType().Equals(typeof(VScrollBar))) { return c.Visible; } } return false; } [VB.NET] ’sample usage Dim vScrollBarVisible = Me.IsScrollBarVisible(Me.DataGrid1) …… Private Function IsScrollBarVisible(ByVal aControl As Control) As Boolean Dim c As Control For Each c In aControl.Controls If c.GetType() Is GetType(VScrollBar) Then Return c.Visible End If Next Return False End Function
How can I prevent all the cells in my DataGrid from being edited without deriving GridColumnStyle
One solution is to remove all the editing controls from the DataGrid.Controls collection. Without these controls, the grid contents cannot be edited. There is a technical problem that requires a little care. You do not want to delete all the controls in DataGrid.Controls as you would lose your scrollbars. The code below deletes all controls except the scrollbars. Alternatively, you could also loop through the controls and only delete the TextBox. [C#] ArrayList al = new ArrayList(); foreach(Control c in this.dataGrid1.Controls) { if(c.GetType() == typeof(VScrollBar) || c.GetType() == typeof(HScrollBar)) { al.Add(c); } } this.dataGrid1.Controls.Clear(); this.dataGrid1.Controls.AddRange((Control[]) al.ToArray(typeof(Control))); [VB.NET] Dim al As New ArrayList() Dim c As Control For Each c In Me.dataGrid1.Controls If c.GetType() = GetType(VScrollBar) Or c.GetType() = GetType(HScrollBar) Then al.Add(c) End If Next c Me.dataGrid1.Controls.Clear() Me.dataGrid1.Controls.AddRange(CType(al.ToArray(GetType(Control)), Control()))
How do I move columns in a datagrid
The columns appear in the order that their column styles were added to the tablestyle being used by the grid. If you want to change this order, you would need to create a new table style, and add the columnstyles in the order you want things to appear. Here is some code snippets that suggest how to do this. [C#] public void MoveColumn(DataGrid _dataGrid, string _mappingName, int fromCol, int toCol) { if(fromCol == toCol) return; DataGridTableStyle oldTS = _dataGrid.TableStyles[_mappingName]; DataGridTableStyle newTS = new DataGridTableStyle(); newTS.MappingName = _mappingName; for(int i = 0; i < oldTS.GridColumnStyles.Count; ++i) { if(i != fromCol && fromCol < toCol) newTS.GridColumnStyles.Add(oldTS.GridColumnStyles[i]); if(i == toCol) newTS.GridColumnStyles.Add(oldTS.GridColumnStyles[fromCol]); if(i != fromCol && fromCol > toCol) newTS.GridColumnStyles.Add(oldTS.GridColumnStyles[i]); } _dataGrid.TableStyles.Remove(oldTS); _dataGrid.TableStyles.Add(newTS); } //sample usage private void button1_Click(object sender, System.EventArgs e) { MoveColumn(myDataGrid, ‘Customers’, 3, 1); } [VB.NET] Public Sub MoveColumn(_dataGrid As DataGrid, _mappingName As String, fromCol As Integer, toCol As Integer) If fromCol = toCol Then Return End If Dim oldTS As DataGridTableStyle = _dataGrid.TableStyles(_mappingName) Dim newTS As New DataGridTableStyle() newTS.MappingName = _mappingName Dim i As Integer i = 0 While i < oldTS.GridColumnStyles.Count If i <> fromCol And fromCol < toCol Then newTS.GridColumnStyles.Add(oldTS.GridColumnStyles(i)) End If If i = toCol Then newTS.GridColumnStyles.Add(oldTS.GridColumnStyles(fromCol)) End If If i <> fromCol And fromCol > toCol Then newTS.GridColumnStyles.Add(oldTS.GridColumnStyles(i)) End If i = i + 1 End While _dataGrid.TableStyles.Remove(oldTS) _dataGrid.TableStyles.Add(newTS) End Sub ’MoveColumn ’sample usage Private Sub button1_Click(sender As Object, e As System.EventArgs) MoveColumn(myDataGrid, ‘Customers’, 3, 1) End Sub ’button1_Click