I am trying to Implement IBindableTemplate for creating custom Edit Template in Batch Edit Mode. Not able to implement the ExtractValues method of IBindableTemplate interface correctly. When I assign the Control.ID in InstantiateIn() method then i am getting the following error. Without this control ID how to get the values in ExtractValues() method.
System.Web.HttpException: Multiple controls with the same ID 'DepartmenCode' were found. FindControl requires that controls have unique IDs.
at System.Web.UI.Control.FillNamedControlsTable(Control namingContainer, ControlCollection controls)
at System.Web.UI.Control.FillNamedControlsTable(Control namingContainer, ControlCollection controls)
at System.Web.UI.Control.FindControl(String id, Int32 pathOffset)
at System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
{
RadGrid theGrid = new RadGrid();
theGrid.ID = this.ID + "Grid";
theGrid.AutoGenerateColumns = false;
theGrid.NeedDataSource += new GridNeedDataSourceEventHandler(theGrid_NeedDataSource);
theGrid.DetailTableDataBind += new GridDetailTableDataBindEventHandler(theGrid_DetailTableDataBind);
theGrid.SortCommand += new GridSortCommandEventHandler(theGrid_SortCommand);
theGrid.ItemDataBound += new GridItemEventHandler(theGrid_ItemDataBound);
theGrid.DataBound += new EventHandler(theGrid_DataBound);
theGrid.PreRender += new EventHandler(theGrid_PreRender);
theGrid.PageIndexChanged += new GridPageChangedEventHandler(theGrid_PageIndexChanged);
//Batch Edit Mode Start
theGrid.BatchEditCommand += new GridBatchEditEventHandler(theGrid_BatchEditCommand);
theGrid.MasterTableView.EditMode = GridEditMode.Batch;
theGrid.MasterTableView.BatchEditingSettings.EditType = GridBatchEditingType.Row;
theGrid.MasterTableView.BatchEditingSettings.OpenEditingEvent = GridBatchEditingEventType.DblClick;
theGrid.MasterTableView.BatchEditingSettings.SaveAllHierarchyLevels = true;
theGrid.MasterTableView.CommandItemSettings.ShowSaveChangesButton = true;
theGrid.MasterTableView.CommandItemSettings.ShowAddNewRecordButton = false;
theGrid.MasterTableView.CommandItemDisplay = GridCommandItemDisplay.TopAndBottom;
theGrid.ShowHeader = true;
theGrid.MasterTableView.CommandItemSettings.ShowCancelChangesButton = true;
//Batch Edit Mode End
SetupGridColumns();
}
private void SetupGridColumns(){
foreach (XmlElement displayField in DisplayFields)
{
SetupGridColumn(displayField)
}
}
private void SetupGridColumn(fieldName){
GridTemplateColumn col=new GridTemplateColumn();
SPField field = TopList.Fields[fieldName];
col.ItemTemplate = new DataGridEditTemplate(ListItemType.Item, fieldName, fieldInternalName, field, theGrid, listView.Utility);
col.EditItemTemplate = new DataGridEditTemplate(ListItemType.EditItem, fieldName,fieldInternalName, field, theGrid, listView.Utility);
col.DataField = fieldInternalName;
GridTableView.Columns.Add(col);
}
private void theGrid_BatchEditCommand(object sender, GridBatchEditingEventArgs e)
{
foreach (GridBatchEditingCommand command in e.Commands)
{
if ((command.Type == GridBatchEditingCommandType.Update))
{
Hashtable newValues = command.NewValues;
Hashtable oldValues = command.OldValues;
string ID = newValues["ID"].ToString();
//string Name = newValues["Name"].ToString();
try
{
SPList list = SPContext.Current.Web.Lists.TryGetList("Department");
SPListItem item = list.GetItemById(Convert.ToInt32(ID));
foreach (DictionaryEntry entry in newValues)
{
if ((string)entry.Key != "ID")
{
item[(string)entry.Key] = entry.Value;
}
}
item.Update();
}
catch (Exception exc)
{
Logger.Log(TraceSeverity.High, this.PageUrl, this.Title, this.CurrentUserName, exc.Message, exc.StackTrace);
#if DEBUG
ErrorMessage = Utility.GetMessage(WADataViewerConstant.ResourceNamespace, "ERROR_OCCURED", exc.ToString());
#else
ErrorMessage = Utility.GetMessage(WADataViewerConstant.ResourceNamespace, "ERROR_OCCURED", exc.Message);
#endif
e.Canceled = true;
}
}
}
}
public class DataGridEditTemplate : IBindableTemplate
{
ListItemType _templateType;
string columnName;
SPField _spField;
RadGrid _theGrid;
bool isAutoPostBack;
string _fieldInternalName;
WAUtility _Utility;
public DataGridEditTemplate(ListItemType templateType, string colname, string fieldInternalName, SPField field, RadGrid grid, WAUtility Utility)
{
_templateType = templateType;
columnName = colname;
_fieldInternalName = fieldInternalName;
_spField = field;
_theGrid = grid;
_Utility = Utility;
}
public void InstantiateIn(System.Web.UI.Control container)
{
Label lc = new Label();
switch (_templateType)
{
case ListItemType.Item:
// lc.Text = "Item " + _fieldInternalName;
lc.DataBinding += new EventHandler(lControl_DataBinding);
//lc.ID =_fieldInternalName;
container.Controls.Add(lc);
break;
case ListItemType.EditItem:
container.Controls.Add(GetControlByFieldType(_spField, null));
break;
}
}
public void lControl_DataBinding(object sender, EventArgs e)
{
Label l = (Label)sender;
GridDataItem container = (GridDataItem)l.NamingContainer;
l.Text = ((DataRowView)container.DataItem)[_fieldInternalName].ToString();
}
private Control GetControlByFieldType(SPField field)
{
Control fieldControl = null;
BaseFormControl basefc = null;
string validationGroup = field.Id + "ValidationGroup";
string mask = null;
string promptCharacter = null;
bool editable = !field.ReadOnlyField;
//bool autoPostBack = IsAutoPostbackField(fieldNode);
switch (field.Type)
{
case SPFieldType.Text:
#region -------------Text----------------------
SPFieldText fieldText = (SPFieldText)field;
TextFieldControl tfc = new TextFieldControl();
basefc = tfc;
tfc.ID = _fieldInternalName;
tfc.ContainerID = validationGroup;
tfc.Mask = mask;
tfc.PromptCharacter = promptCharacter;
tfc.FieldMaxLength = fieldText.MaxLength;
tfc.FieldDisplaySize = fieldText.DisplaySize;
tfc.FieldIMEMode = fieldText.IMEMode;
tfc.Editable=editable;
fieldControl = tfc;
break;
#endregion -------------Text----------------------
}
}
public System.Collections.Specialized.IOrderedDictionary ExtractValues(System.Web.UI.Control container)
{
System.Collections.Specialized.OrderedDictionary od = null;
//od.Add("OrderID", ((DropDownList)(((GridEditFormItem)(container)).FindControl("dropdownlist1"))).DataValueField);
//if (container is GridDataItem)
//{
// GridDataItem dataItem = container as GridDataItem;
//}
//if (container is GridEditFormItem)
{
od = new System.Collections.Specialized.OrderedDictionary();
//od.Add(_fieldInternalName, ((DropDownList)(((GridEditFormItem)(container)).FindControl("_fieldInternalName"))).DataValueField);
//Control ctrl = ((container)).FindControl("_fieldInternalName");
foreach (Control ctrl in container.Controls)
{
if (ctrl.Controls.Count > 0)
{
Type ctrlType = ctrl.Controls[0].GetType();
if (ctrlType == typeof(DropDownList))
{
od.Add(ctrl.Controls[0].UniqueID, ((DropDownList)(ctrl.Controls[0])).DataValueField);
}
if (ctrlType == typeof(TextBox))
{
od.Add(ctrl.Controls[0].UniqueID, ((TextBox)(ctrl.Controls[0])).Text);
}
if (ctrlType == typeof(Label))
{
od.Add(ctrl.Controls[0].UniqueID, ((Label)(ctrl.Controls[0])).Text);
}
}
}
}
return od;
}
}