This article is as a result of this thread not editable attribute on the Dynamic Data Forum:
What you need to do is:
-
Use the ReadOnlyAttribute in System.ComponentModel and attribute up the column you want as read only in edit mode
-
Create an class that implements IAutoFieldGenrator.
-
A custom DynamicField.
And here's the sample:
using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Web.DynamicData; using System.Web.UI; using System.Web.UI.WebControls; public class FieldsManager : IAutoFieldGenerator { protected MetaTable _table; public FieldsManager(MetaTable table) { _table = table; } public ICollection GenerateFields(Control control) { var oFields = new List<DynamicField>(); foreach (var column in _table.Columns) { // carry on the loop at the next column // if scaffold table is set to false or DenyRead if (!column.Scaffold || column.IsLongString) continue; DynamicField f; // here we check to dee if (column.Attributes.OfType<ReadOnlyAttribute>().
DefaultIfEmpty(new ReadOnlyAttribute(false)).
FirstOrDefault().IsReadOnly) f = new DynamicReadonlyField(); else f = new DynamicField(); f.DataField = column.Name; oFields.Add(f); } return oFields; } } // special thanks to david Ebbo for this public class DynamicReadonlyField : DynamicField { public override void InitializeCell( DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex) { if (cellType == DataControlCellType.DataCell) { var control = new DynamicControl() { DataField = DataField }; // Copy various properties into the control control.UIHint = UIHint; control.HtmlEncode = HtmlEncode; control.NullDisplayText = NullDisplayText; // this the default for DynamicControl and has to be // manually changed you do not need this line of code // its there just to remind us what we are doing. control.Mode = DataBoundControlMode.ReadOnly; cell.Controls.Add(control); } else { base.InitializeCell(cell, cellType, rowState, rowIndex); } } }
And in the Edit page add:
protected void Page_Init(object sender, EventArgs e) { DynamicDataManager1.RegisterControl(DetailsView1); table = DetailsDataSource.GetTable(); DetailsView1.RowsGenerator = new FieldsManager(table); }
In the Page_Init add the BOLD ITALIC lines
This is a direct copy of the answer I gave in the thread
2 comments:
i was getting error
var oFields = new List();
changed to (it worked )
List< DynamicField > oFields = new List< DynamicField >();
from post
http://csharpbits.notaclue.net/2008/05/dynamicdata-generate-columnsrows-using.html
It may be that the <DynamicField> got dropper if I copied it from the Forum :(
Thanks I'll check the code and update the article
Steve :D
Post a Comment