private void DynamicStuff(TableLayoutPanel table) { //I'm thinking about adding a database table //linked to records that will handle special //cases like dates that need calendars, validation, //dropdownlists, checkboxes, radio buttons, etc. //Maybe for dropdownlists have recordsets prepared ahead //to return as part of payload. // //Need to practice addding title to top of screen while //retaining docked table. //Start - Can loop this to get most labels and entry. //Switch on type //case most: int curCol = 1; DataRow detailRow = DataSource[0].Rows[0]; for (int i = 0; i < ColumnNames.Count; i++) { Label label1 = new Label(); label1.Text = ColumnNames[i]; table.Controls.Add(label1, curCol, i); //DataRow drSpecial = DataSource[1].Rows.Find(ColumnNames[i]); var drSpecial = MetaList.Find(x => x.FieldName == ColumnNames[i]); if (drSpecial != null) { ColumnMetaData m = new ColumnMetaData(); if (drSpecial.ControlType.Contains("DropDownList")) { int resultTableIndex = 0; //This gets table index from Control Type comma delimited //if a ComboBox. Start index at 2 because 1=Detail row and //2=Meta data table. int.TryParse(drSpecial.ControlType.Split(',')[1], out resultTableIndex); ComboBox cmb = new ComboBox(); foreach (DataRow item in DataSource[resultTableIndex].Rows) { cmb.Items.Add(item["Text"].ToString()); } cmb.SelectedText = detailRow[i].ToString(); table.Controls.Add(cmb, drSpecial.ColumnPosition + 1, i); } } else //Just use standard textbox for input. { TextBox textbox1 = new TextBox(); textbox1.Text = detailRow[i].ToString(); table.Controls.Add(textbox1, curCol + 1, i); } } //case check: //case dropdownlist: //case date calendar: //End - Can loop this to get most labels and entry. //Label label2 = new Label(); //label2.Text = ColumnNames[1]; //TextBox tbName = new TextBox(); //tbName.Text = DataRow1[1].ToString(); //tbName.Width = 200; //table.Controls.Add(label1, 1, 1); //table.Controls.Add(label2, 1, 2); //table.Controls.Add(tbId, 2, 1); //table.Controls.Add(tbName, 2, 2); }
private List<DataTable> GetRecord() { string queryString = string.Format( @" --Detail Row SELECT * FROM {0} WHERE CustomerID=@search; --Supporting Data for detail page. DECLARE @tableName NVARCHAR(50) = 'Customers' DECLARE @stmt NVARCHAR(MAX); SELECT * FROM SpecialTable1 WHERE TableName = @tableName; DECLARE @SqlStatementCursor CURSOR SET @SqlStatementCursor = CURSOR FAST_FORWARD FOR SELECT SqlStatements FROM SpecialTable1 WHERE TableName = @tableName; OPEN @SqlStatementCursor FETCH NEXT FROM @SqlStatementCursor INTO @stmt WHILE @@FETCH_STATUS = 0 BEGIN EXEC (@stmt) FETCH NEXT FROM @SqlStatementCursor INTO @stmt END CLOSE @SqlStatementCursor DEALLOCATE @SqlStatementCursor ", TABLE_NAME); List<DataTable> list = GetDatabaseRecords(queryString, RECORD_ID); ucDetailView1.ColumnNames = new List<string>(); //How do I get column names to print in this C# program? //http://stackoverflow.com/a/2557943/139698 foreach (DataColumn item in list[0].Columns) { ucDetailView1.ColumnNames.Add(item.ColumnName); } List<ColumnMetaData> meta = new List<ColumnMetaData>(); DataTable dt1 = list[1]; //dt1.PrimaryKey = new DataColumn[] { dt1.Columns["FieldName"] }; foreach (DataRow dr in dt1.Rows) { ColumnMetaData c = new ColumnMetaData(); c.FieldName = dr["FieldName"].ToString(); int colPos = 0; int.TryParse(dr["ColumnPosition"].ToString(), out colPos); c.ColumnPosition = colPos; int rowPos = 0; int.TryParse(dr["RowPosition"].ToString(), out rowPos); c.RowPosition = rowPos; c.ControlType = dr["ControlType"].ToString(); meta.Add(c); } ucDetailView1.MetaList = meta; return list; }