How can I create an instance of a Form class just from knowing its name in a string
You can use the System.Reflection.Assembly.CreateInstance method to create a form from its name. Below is a code snippet. The name in the textbox has to be the full name including its namespace. So if there is a class named Form2 in namespace MyCompanyName, then the textbox would contain MyCompanyName.Form2. This snippet also assumes that the class is defined in the current executing assembly. If not, you would have to create an instance of the assembly that contains the class instead of calling the static method GetExecutingAssembly. As noted on this board, using reflection in this manner might affect performance. You can download working samples (VB.NET, C#). [C#] try { Assembly tempAssembly = Assembly.GetExecutingAssembly(); // if class is located in another DLL or EXE, use something like // Assembly tempAssembly = Assembly.LoadFrom(”myDLL.DLL”); // or // Assembly tempAssembly = Assembly.LoadFrom(”myEXE.exe”); Form frm1 = (Form) tempAssembly.CreateInstance(textBox1.Text);// as Form; frm1.Show(); } catch(Exception ex) { MessageBox.Show(”Error creating: ”+ textBox1.Text); } [VB.NET] textBox1.Text = ”MyNameSpace.Form2” …… Try Dim tempAssembly As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly() ’ if class is located in another DLL or EXE, use something like ’ tempAssembly = Assembly.LoadFrom(”myDLL.DLL”) ’ or ’ tempAssembly = Assembly.LoadFrom(”myEXE.exe”) Dim frm1 As Form = CType(tempAssembly.CreateInstance(textBox1.Text), Form) ’ as Form; frm1.Show() Catch ex As Exception MessageBox.Show(”Error creating: ” + ex.ToString()) End Try
With a wide pen, how can I control how the endpoints of my line appear
The LineCap property of the Pen class controls how the ends of your line segments appear. You can set each end independently using the StartCap and EndCap properties of the Pen class. The following code segment produces the picture below. private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Pen redPen = new Pen(Color.LightSalmon, 20); int startX = 80; int startY = 30; int width = this.ClientSize.Width – 2 * startX; Font _font = new Font(“Arial Black”, 13); foreach(LineCap LC in new LineCap[] { LineCap.ArrowAnchor, LineCap.DiamondAnchor, LineCap.Flat, LineCap.Round, LineCap.RoundAnchor, LineCap.Square, LineCap.SquareAnchor, LineCap.Triangle}) { redPen.StartCap = LC; redPen.EndCap = LC; Point p1 = new Point(startX, startY); Point p2 = new Point(startX + width, startY); e.Graphics.DrawLine(redPen, p1, p2); e.Graphics.DrawString( LC.ToString(), _font, new SolidBrush(Color.Blue), startX + 40, startY – 13 ); startY += 50; } }
How do I add an unbound column to my bound datagrid
The idea is to create the ’bound’ table in your dataset, and then add an extra ’unbound’ column. The steps are to derive a custom columnstyle that overrides Paint where you calculate and draw the unbound value. You can also override Edit to prevent the user from selecting your unbound column. Then to get your datagrid to use this special column style, you create a tablestyle and add the column styles to it in the order you want the columns to appear in the datagrid. Here are code snippets that derive the column and use the derived column. You can download a working sample. // custom column style that is an unbound column public class DataGridUnboundColumn : DataGridTextBoxColumn { protected override void Edit(System.Windows.Forms.CurrencyManager source, int rowNum, System.Drawing.Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible) { //do not allow the unbound cell to become active if(this.MappingName == ”UnBound”) return; base.Edit(source, rowNum, bounds, readOnly, instantText, cellIsVisible); } protected override void Paint(System.Drawing.Graphics g, System.Drawing.Rectangle bounds, System.Windows.Forms.CurrencyManager source, int rowNum, System.Drawing.Brush backBrush, System.Drawing.Brush foreBrush, bool alignToRight) { //clear the cell g.FillRectangle(new SolidBrush(Color.White), bounds); //compute & draw the value //string s = string.Format(”{0} row”, rowNum); // col 0 + 2 chars from col 1 DataGrid parent = this.DataGridTableStyle.DataGrid; string s = parent[rowNum, 0].ToString() + ((parent[rowNum, 1].ToString())+ ” ”).Substring(0,2); Font font = new Font(”Arial”, 8.25f); g.DrawString(s, font, new SolidBrush(Color.Black), bounds.X, bounds.Y); font.Dispose(); } } //code that uses this unbound column private void Form1_Load(object sender, System.EventArgs e) { // Set the connection and sql strings // assumes your mdb file is in your root string connString = @”Provider=Microsoft.JET.OLEDB.4.0;data source=C:\northwind.mdb”; string sqlString = ”SELECT * FROM customers”; OleDbDataAdapter dataAdapter = null; DataSet _dataSet = null; try { // Connection object OleDbConnection connection = new OleDbConnection(connString); // Create data adapter object dataAdapter = new OleDbDataAdapter(sqlString, connection); // Create a dataset object and fill with data using data adapter’s Fill method _dataSet = new DataSet(); dataAdapter.Fill(_dataSet, ”customers”); connection.Close(); } catch(Exception ex) { MessageBox.Show(”Problem with DB access-\n\n connection: ” + connString + ”\r\n\r\n query: ” + sqlString + ”\r\n\r\n\r\n” + ex.ToString()); this.Close(); return; } // Create a table style that will hold the new column style // that we set and also tie it to our customer’s table from our DB DataGridTableStyle tableStyle = new DataGridTableStyle(); tableStyle.MappingName = ”customers”; // since the dataset has things like field name and number of columns, // we will use those to create new columnstyles for the columns in our DB table int numCols = _dataSet.Tables[”customers”].Columns.Count; //add an extra column at the end of our customers table _dataSet.Tables[”customers”].Columns.Add(”Unbound”); DataGridTextBoxColumn aColumnTextColumn ; for(int i = 0; i < numCols; ++i) { aColumnTextColumn = new DataGridTextBoxColumn(); aColumnTextColumn.HeaderText = _dataSet.Tables[”customers”].Columns[i].ColumnName; aColumnTextColumn.MappingName = _dataSet.Tables[”customers”].Columns[i].ColumnName; tableStyle.GridColumnStyles.Add(aColumnTextColumn); //display the extra column after column 1. if( i == 1) { DataGridUnboundColumn unboundColStyle = new DataGridUnboundColumn(); unboundColStyle.HeaderText = ”UnBound”; unboundColStyle.MappingName = ”UnBound”; tableStyle.GridColumnStyles.Add(unboundColStyle); } } // make the dataGrid use our new tablestyle and bind it to our table dataGrid1.TableStyles.Clear(); dataGrid1.TableStyles.Add(tableStyle); dataGrid1.DataSource = _dataSet.Tables[”customers”]; } }
How can I implement OLE Drag & Drop between a DataGrid and another OLE DnD object that supports the Text format
The attached samples (C#, VB) have a derived datagrid that supports OLE D&D with any OLE D&D provider that handles a Text formatted data object. The derived grid handles six events to allow it to be both a drop source and a drop target. The sample project has two datagrids where you can drag cell text back and forth. You can also open Excel, and drag text between Excel and either datagrid. Here are the events that are handled in this sample. MouseDown – Used to save the row and column of a mousedown, ’mousedowncell’. MouseMove – Checks to see if you drag off the mousedowncell, and if so, starts a the DoDragDrop. MouseUp – Used to reset the mousedowncell. DragEnter – Checks to see if the data object has text, and if so, allows a Copy operation. (This could be changed to support Move/Copy.) DragOver – Used to set a NoDrop cursor if you move over the mousedowncell (if mousedowncell has been set). DragDrop – Used to drop the text into the datagrid.
Is there an easy way to Create/Delete/Move files in the Windows File System?
Use File.Create, Delete and Move static methods.