Author: lluis
Date: 2005-04-14 08:24:07 -0400 (Thu, 14 Apr 2005)
New Revision: 42997
Modified:
trunk/mcs/class/System.Web/System.Web.UI.WebControls/AutoGeneratedField.cs
trunk/mcs/class/System.Web/System.Web.UI.WebControls/BoundField.cs
trunk/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog
trunk/mcs/class/System.Web/System.Web.UI.WebControls/CheckBoxField.cs
trunk/mcs/class/System.Web/System.Web.UI.WebControls/CommandField.cs
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DataBoundControl.cs
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsView.cs
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsViewInsertEventArgs.cs
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsViewInsertedEventArgs.cs
trunk/mcs/class/System.Web/System.Web.UI.WebControls/ImageField.cs
trunk/mcs/class/System.Web/System.Web.UI.WebControls/ObjectDataSource.cs
trunk/mcs/class/System.Web/System.Web.UI.WebControls/ObjectDataSourceView.cs
trunk/mcs/class/System.Web/System.Web.UI.WebControls/Parameter.cs
trunk/mcs/class/System.Web/System.Web.UI.WebControls/ParameterCollection.cs
Log:
2005-04-14 Lluis Sanchez Gual <[EMAIL PROTECTED]>
* DetailsView.cs: Implemented support for Insert operation.
Added header and footer templates. Added missing style
properties.
* ObjectDataSourceView.cs: Use ParameterCollection.GetValues
to get filter values. Other minor fixes.
* CommandField.cs: Properly render the Insert and New buttons.
* ObjectDataSource.cs: Update the parameter collections after
the page is loaded. This will fire the ParameterChanged event
if needed.
* DataBoundControl.cs: The OnDataSourceViewChanged method
is called when the view changes, not when the datasource
changes.
* DetailsViewInsertedEventArgs.cs:
* DetailsViewInsertEventArgs.cs: Implement Values property.
* ImageField.cs:
* AutoGeneratedField.cs
* BoundField.cs:
* CheckBoxField.cs:
Take into account the Insert mode.
* ParameterCollection.cs: Implemented UpdateValues and fixed
GetValues (values can't be cached because can change).
* Parameter.cs: Detect value changes in GetValue, and fire
the change event if needed. Removed unused ParameterValue
property. Other fixes.
Modified:
trunk/mcs/class/System.Web/System.Web.UI.WebControls/AutoGeneratedField.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/AutoGeneratedField.cs
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/AutoGeneratedField.cs
2005-04-14 12:24:07 UTC (rev 42997)
@@ -94,7 +94,7 @@
[MonoTODO ("Support other data types")]
public override void InitializeDataCell (DataControlFieldCell
cell, DataControlRowState rowState)
{
- bool editable = (rowState & DataControlRowState.Edit)
!= 0;
+ bool editable = (rowState & (DataControlRowState.Edit |
DataControlRowState.Insert)) != 0;
if (dataType == typeof(bool)) {
CheckBox box = new CheckBox ();
Modified: trunk/mcs/class/System.Web/System.Web.UI.WebControls/BoundField.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/BoundField.cs
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/BoundField.cs
2005-04-14 12:24:07 UTC (rev 42997)
@@ -132,7 +132,8 @@
public override void ExtractValuesFromCell (IOrderedDictionary
dictionary,
DataControlFieldCell cell, DataControlRowState
rowState, bool includeReadOnly)
{
- if ((rowState & DataControlRowState.Edit) != 0 &&
!ReadOnly) {
+ bool editable = (rowState & (DataControlRowState.Edit |
DataControlRowState.Insert)) != 0;
+ if (editable && !ReadOnly) {
if (cell.Controls.Count > 0) {
TextBox box = (TextBox) cell.Controls
[0];
dictionary [DataField] = box.Text;
@@ -154,7 +155,8 @@
public virtual void InitializeDataCell (DataControlFieldCell
cell, DataControlRowState rowState)
{
- if ((rowState & DataControlRowState.Edit) != 0 &&
!ReadOnly) {
+ bool editable = (rowState & (DataControlRowState.Edit |
DataControlRowState.Insert)) != 0;
+ if (editable && !ReadOnly) {
TextBox box = new TextBox ();
cell.Controls.Add (box);
}
Modified: trunk/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog
2005-04-14 12:24:07 UTC (rev 42997)
@@ -1,3 +1,33 @@
+2005-04-14 Lluis Sanchez Gual <[EMAIL PROTECTED]>
+
+ * DetailsView.cs: Implemented support for Insert operation.
+ Added header and footer templates. Added missing style
+ properties.
+ * ObjectDataSourceView.cs: Use ParameterCollection.GetValues
+ to get filter values. Other minor fixes.
+ * CommandField.cs: Properly render the Insert and New buttons.
+ * ObjectDataSource.cs: Update the parameter collections after
+ the page is loaded. This will fire the ParameterChanged event
+ if needed.
+ * DataBoundControl.cs: The OnDataSourceViewChanged method
+ is called when the view changes, not when the datasource
+ changes.
+
+ * DetailsViewInsertedEventArgs.cs:
+ * DetailsViewInsertEventArgs.cs: Implement Values property.
+
+ * ImageField.cs:
+ * AutoGeneratedField.cs
+ * BoundField.cs:
+ * CheckBoxField.cs:
+ Take into account the Insert mode.
+
+ * ParameterCollection.cs: Implemented UpdateValues and fixed
+ GetValues (values can't be cached because can change).
+ * Parameter.cs: Detect value changes in GetValue, and fire
+ the change event if needed. Removed unused ParameterValue
+ property. Other fixes.
+
2005-04-08 Lluis Sanchez Gual <[EMAIL PROTECTED]>
* DetailsView.cs: Initial implementation.
Modified: trunk/mcs/class/System.Web/System.Web.UI.WebControls/CheckBoxField.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/CheckBoxField.cs
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/CheckBoxField.cs
2005-04-14 12:24:07 UTC (rev 42997)
@@ -94,7 +94,7 @@
public override void InitializeDataCell (DataControlFieldCell
cell, DataControlRowState rowState)
{
- bool editable = (rowState & DataControlRowState.Edit)
!= 0;
+ bool editable = (rowState & (DataControlRowState.Edit |
DataControlRowState.Insert)) != 0;
CheckBox box = new CheckBox ();
box.Enabled = editable && !ReadOnly;
cell.Controls.Add (box);
Modified: trunk/mcs/class/System.Web/System.Web.UI.WebControls/CommandField.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/CommandField.cs
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/CommandField.cs
2005-04-14 12:24:07 UTC (rev 42997)
@@ -334,6 +334,12 @@
AddSeparator (cell);
cell.Controls.Add (new
DataControlButton (Control, CancelText, CancelImageUrl, "Cancel", index,
false));
}
+ } else if ((rowState &
DataControlRowState.Insert) != 0) {
+ cell.Controls.Add (new
DataControlButton (Control, InsertText, InsertImageUrl, "Insert", index,
false));
+ if (ShowCancelButton) {
+ AddSeparator (cell);
+ cell.Controls.Add (new
DataControlButton (Control, CancelText, CancelImageUrl, "Cancel", index,
false));
+ }
} else {
if (ShowEditButton) {
AddSeparator (cell);
@@ -349,7 +355,7 @@
}
if (ShowInsertButton) {
AddSeparator (cell);
- cell.Controls.Add (new
DataControlButton (Control, InsertText, InsertImageUrl, "Insert", index,
false));
+ cell.Controls.Add (new
DataControlButton (Control, NewText, NewImageUrl, "New", index, false));
}
}
} else
Modified:
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DataBoundControl.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/DataBoundControl.cs
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/DataBoundControl.cs
2005-04-14 12:24:07 UTC (rev 42997)
@@ -43,7 +43,7 @@
public abstract class DataBoundControl : BaseDataBoundControl
{
DataSourceSelectArguments selectArguments;
- IDataSource currentSource;
+ DataSourceView currentView;
protected DataBoundControl ()
{
@@ -73,6 +73,13 @@
protected DataSourceView GetData ()
{
+ if (currentView == null)
+ UpdateViewData ();
+ return currentView;
+ }
+
+ protected DataSourceView InternalGetData ()
+ {
if (DataSource != null && IsBoundUsingDataSourceID)
throw new HttpException ("Control bound using
both DataSourceID and DataSource properties.");
@@ -86,7 +93,7 @@
protected override void OnDataPropertyChanged ()
{
base.OnDataPropertyChanged ();
- SubscribeSourceChangeEvent ();
+ UpdateViewData ();
}
protected virtual void OnDataSourceViewChanged (object sender,
EventArgs e)
@@ -97,20 +104,21 @@
protected override void OnPagePreLoad (object sender, EventArgs
e)
{
base.OnPagePreLoad (sender, e);
- SubscribeSourceChangeEvent ();
+ UpdateViewData ();
}
- void SubscribeSourceChangeEvent ()
+ void UpdateViewData ()
{
- IDataSource ds = GetDataSource ();
-
- if (currentSource != null && currentSource != ds) {
- currentSource.DataSourceChanged -= new
EventHandler (OnDataSourceViewChanged);
- currentSource = ds;
- }
-
- if (ds != null)
- ds.DataSourceChanged += new EventHandler
(OnDataSourceViewChanged);
+ DataSourceView view = InternalGetData ();
+ if (view == currentView) return;
+
+ if (currentView != null)
+ currentView.DataSourceViewChanged -= new
EventHandler (OnDataSourceViewChanged);
+
+ currentView = view;
+
+ if (view != null)
+ view.DataSourceViewChanged += new EventHandler
(OnDataSourceViewChanged);
}
// should be `internal protected' (why, oh WHY did they do that
!?!)
Modified: trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsView.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsView.cs
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsView.cs
2005-04-14 12:24:07 UTC (rev 42997)
@@ -63,9 +63,14 @@
ITemplate pagerTemplate;
ITemplate emptyDataTemplate;
+ ITemplate headerTemplate;
+ ITemplate footerTemplate;
PropertyDescriptor[] cachedKeyProperties;
readonly string[] emptyKeys = new string[0];
+
+ CommandField commandField;
+ DetailsViewRow commandRow;
// View state
DataControlFieldCollection columns;
@@ -73,11 +78,15 @@
TableItemStyle alternatingRowStyle;
TableItemStyle editRowStyle;
+ TableItemStyle insertRowStyle;
TableItemStyle emptyDataRowStyle;
TableItemStyle footerStyle;
TableItemStyle headerStyle;
TableItemStyle pagerStyle;
TableItemStyle rowStyle;
+ TableItemStyle commandRowStyle;
+ TableItemStyle fieldHeaderStyle;
+
DataKey key;
DataKey oldEditValues;
AutoGeneratedFieldProperties[] autoFieldProperties;
@@ -88,7 +97,10 @@
private static readonly object ItemCreatedEvent = new object();
private static readonly object ItemDeletedEvent = new object();
private static readonly object ItemDeletingEvent = new object();
+ private static readonly object ItemInsertedEvent = new object();
+ private static readonly object ItemInsertingEvent = new
object();
private static readonly object ModeChangingEvent = new object();
+ private static readonly object ModeChangedEvent = new object();
private static readonly object ItemUpdatedEvent = new object();
private static readonly object ItemUpdatingEvent = new object();
@@ -131,11 +143,26 @@
remove { Events.RemoveHandler (ItemDeletingEvent,
value); }
}
+ public event DetailsViewInsertedEventHandler ItemInserted {
+ add { Events.AddHandler (ItemInsertedEvent, value); }
+ remove { Events.RemoveHandler (ItemInsertedEvent,
value); }
+ }
+
+ public event DetailsViewInsertEventHandler ItemInserting {
+ add { Events.AddHandler (ItemInsertingEvent, value); }
+ remove { Events.RemoveHandler (ItemInsertingEvent,
value); }
+ }
+
public event DetailsViewModeEventHandler ModeChanging {
add { Events.AddHandler (ModeChangingEvent, value); }
remove { Events.RemoveHandler (ModeChangingEvent,
value); }
}
+ public event EventHandler ModeChanged {
+ add { Events.AddHandler (ModeChangedEvent, value); }
+ remove { Events.RemoveHandler (ModeChangedEvent,
value); }
+ }
+
public event DetailsViewUpdatedEventHandler ItemUpdated {
add { Events.AddHandler (ItemUpdatedEvent, value); }
remove { Events.RemoveHandler (ItemUpdatedEvent,
value); }
@@ -186,6 +213,22 @@
}
}
+ protected virtual void OnItemInserted
(DetailsViewInsertedEventArgs e)
+ {
+ if (Events != null) {
+ DetailsViewInsertedEventHandler eh =
(DetailsViewInsertedEventHandler) Events [ItemInsertedEvent];
+ if (eh != null) eh (this, e);
+ }
+ }
+
+ protected virtual void OnItemInserting
(DetailsViewInsertEventArgs e)
+ {
+ if (Events != null) {
+ DetailsViewInsertEventHandler eh =
(DetailsViewInsertEventHandler) Events [ItemInsertingEvent];
+ if (eh != null) eh (this, e);
+ }
+ }
+
protected virtual void OnItemDeleting
(DetailsViewDeleteEventArgs e)
{
if (Events != null) {
@@ -194,6 +237,14 @@
}
}
+ protected virtual void OnModeChanged (EventArgs e)
+ {
+ if (Events != null) {
+ EventHandler eh = (EventHandler) Events
[ModeChangedEvent];
+ if (eh != null) eh (this, e);
+ }
+ }
+
protected virtual void OnModeChanging (DetailsViewModeEventArgs
e)
{
if (Events != null) {
@@ -278,6 +329,20 @@
}
[WebCategoryAttribute ("Behavior")]
+ [DefaultValueAttribute (false)]
+ public virtual bool AutoGenerateInsertButton {
+ get {
+ object ob = ViewState
["AutoGenerateInsertButton"];
+ if (ob != null) return (bool) ob;
+ return false;
+ }
+ set {
+ ViewState ["AutoGenerateInsertButton"] = value;
+ RequireBinding ();
+ }
+ }
+
+ [WebCategoryAttribute ("Behavior")]
[DefaultValueAttribute (true)]
public virtual bool AutoGenerateRows {
get {
@@ -376,6 +441,22 @@
}
}
+ [DefaultValueAttribute (null)]
+ [WebCategoryAttribute ("Styles")]
+ [PersistenceMode (PersistenceMode.InnerProperty)]
+ [NotifyParentProperty (true)]
+ [DesignerSerializationVisibility
(DesignerSerializationVisibility.Content)]
+ public virtual TableItemStyle CommandRowStyle {
+ get {
+ if (commandRowStyle == null) {
+ commandRowStyle = new TableItemStyle ();
+ if (IsTrackingViewState)
+
commandRowStyle.TrackViewState();
+ }
+ return commandRowStyle;
+ }
+ }
+
[DesignerSerializationVisibilityAttribute
(DesignerSerializationVisibility.Hidden)]
[BrowsableAttribute (false)]
public DetailsViewMode CurrentMode {
@@ -384,6 +465,20 @@
}
}
+ [DefaultValueAttribute (DetailsViewMode.ReadOnly)]
+ [WebCategoryAttribute ("Behavior")]
+ public virtual DetailsViewMode DefaultMode {
+ get {
+ object o = ViewState ["DefaultMode"];
+ if (o != null) return (DetailsViewMode) o;
+ return DetailsViewMode.ReadOnly;
+ }
+ set {
+ ViewState ["DefaultMode"] = value;
+ RequireBinding ();
+ }
+ }
+
[EditorAttribute
("System.Web.UI.Design.WebControls.DataControlFieldTypeEditor, System.Design,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
"System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
[MergablePropertyAttribute (false)]
[PersistenceModeAttribute (PersistenceMode.InnerProperty)]
@@ -497,6 +592,22 @@
}
}
+ [WebCategoryAttribute ("Styles")]
+ [PersistenceMode (PersistenceMode.InnerProperty)]
+ [NotifyParentProperty (true)]
+ [DefaultValue (null)]
+ [DesignerSerializationVisibility
(DesignerSerializationVisibility.Content)]
+ public virtual TableItemStyle FieldHeaderStyle {
+ get {
+ if (fieldHeaderStyle == null) {
+ fieldHeaderStyle = new TableItemStyle
();
+ if (IsTrackingViewState)
+
fieldHeaderStyle.TrackViewState();
+ }
+ return fieldHeaderStyle;
+ }
+ }
+
[DesignerSerializationVisibilityAttribute
(DesignerSerializationVisibility.Hidden)]
[BrowsableAttribute (false)]
public virtual DetailsViewRow FooterRow {
@@ -506,6 +617,30 @@
}
}
+ [DefaultValue (null)]
+ [TemplateContainer (typeof(DetailsView),
BindingDirection.OneWay)]
+ [PersistenceMode (PersistenceMode.InnerProperty)]
+ [Browsable (false)]
+ public ITemplate FooterTemplate {
+ get { return footerTemplate; }
+ set { footerTemplate = value; RequireBinding (); }
+ }
+
+ [LocalizableAttribute (true)]
+ [WebCategoryAttribute ("Appearance")]
+ [DefaultValueAttribute ("")]
+ public string FooterText {
+ get {
+ object ob = ViewState ["FooterText"];
+ if (ob != null) return (string) ob;
+ return string.Empty;
+ }
+ set {
+ ViewState ["FooterText"] = value;
+ RequireBinding ();
+ }
+ }
+
[WebCategoryAttribute ("Styles")]
[PersistenceMode (PersistenceMode.InnerProperty)]
[NotifyParentProperty (true)]
@@ -560,6 +695,30 @@
}
}
+ [DefaultValue (null)]
+ [TemplateContainer (typeof(DetailsView),
BindingDirection.OneWay)]
+ [PersistenceMode (PersistenceMode.InnerProperty)]
+ [Browsable (false)]
+ public ITemplate HeaderTemplate {
+ get { return headerTemplate; }
+ set { headerTemplate = value; RequireBinding (); }
+ }
+
+ [LocalizableAttribute (true)]
+ [WebCategoryAttribute ("Appearance")]
+ [DefaultValueAttribute ("")]
+ public string HeaderText {
+ get {
+ object ob = ViewState ["HeaderText"];
+ if (ob != null) return (string) ob;
+ return string.Empty;
+ }
+ set {
+ ViewState ["HeaderText"] = value;
+ RequireBinding ();
+ }
+ }
+
[DefaultValueAttribute (HorizontalAlign.NotSet)]
public virtual HorizontalAlign HorizontalAlign {
get {
@@ -573,6 +732,22 @@
}
}
+ [WebCategoryAttribute ("Styles")]
+ [PersistenceMode (PersistenceMode.InnerProperty)]
+ [NotifyParentProperty (true)]
+ [DesignerSerializationVisibility
(DesignerSerializationVisibility.Content)]
+ [DefaultValueAttribute (null)]
+ public virtual TableItemStyle InsertRowStyle {
+ get {
+ if (insertRowStyle == null) {
+ insertRowStyle = new TableItemStyle ();
+ if (IsTrackingViewState)
+ insertRowStyle.TrackViewState();
+ }
+ return insertRowStyle;
+ }
+ }
+
[BrowsableAttribute (false)]
[DesignerSerializationVisibilityAttribute
(DesignerSerializationVisibility.Hidden)]
public int PageCount {
@@ -684,7 +859,19 @@
return dataItem;
}
}
+
+ [DesignerSerializationVisibilityAttribute
(DesignerSerializationVisibility.Hidden)]
+ [BrowsableAttribute (false)]
+ public int DataItemCount {
+ get { return PageCount; }
+ }
+ [DesignerSerializationVisibilityAttribute
(DesignerSerializationVisibility.Hidden)]
+ [BrowsableAttribute (false)]
+ public int DataItemIndex {
+ get { return PageIndex; }
+ }
+
public virtual bool IsBindableType (Type type)
{
return type.IsPrimitive || type == typeof(string) ||
type == typeof(DateTime) || type == typeof(Guid);
@@ -712,11 +899,13 @@
fields.AddRange (Fields);
- if (AutoGenerateEditButton || AutoGenerateDeleteButton)
{
+ if (AutoGenerateEditButton || AutoGenerateDeleteButton
|| AutoGenerateInsertButton) {
CommandField field = new CommandField ();
field.ShowEditButton = AutoGenerateEditButton;
field.ShowDeleteButton =
AutoGenerateDeleteButton;
+ field.ShowInsertButton =
AutoGenerateInsertButton;
fields.Add (field);
+ commandField = field;
}
return fields;
@@ -834,6 +1023,10 @@
Controls.Add (table);
ArrayList list = new ArrayList ();
+
+ if (!Page.IsPostBack)
+ currentMode = DefaultMode;
+
// Gets the current data item
@@ -857,6 +1050,18 @@
// Main table creation
+ if (HeaderText.Length != 0 || headerTemplate != null) {
+ headerRow = CreateRow (-1,
DataControlRowType.Header, DataControlRowState.Normal);
+ DataControlFieldCell cell = new
DataControlFieldCell (null);
+ cell.ColumnSpan = 2;
+ if (headerTemplate != null)
+ headerTemplate.InstantiateIn (cell);
+ else
+ cell.Text = HeaderText;
+ headerRow.Cells.Add (cell);
+ table.Rows.Add (headerRow);
+ }
+
if (showPager && PagerSettings.Position ==
PagerPosition.Top || PagerSettings.Position == PagerPosition.TopAndBottom) {
topPagerRow = CreatePagerRow (dataSource);
table.Rows.Add (topPagerRow);
@@ -868,9 +1073,15 @@
table.Rows.Add (row);
list.Add (row);
InitializeRow (row, field);
- if (dataBinding)
+ if (dataBinding && CurrentMode !=
DetailsViewMode.Insert)
row.DataBind ();
+
+ if (commandField == field)
+ commandRow = row;
}
+
+ rows = new DetailsViewRowCollection (list);
+
if (dataBinding) {
if (CurrentMode == DetailsViewMode.Edit)
oldEditValues = new DataKey
(GetRowValues (false, true));
@@ -889,7 +1100,17 @@
table.Rows.Add (bottomPagerRow);
}
- rows = new DetailsViewRowCollection (list);
+ if (FooterText.Length != 0 || footerTemplate != null) {
+ footerRow = CreateRow (-1,
DataControlRowType.Footer, DataControlRowState.Normal);
+ DataControlFieldCell cell = new
DataControlFieldCell (null);
+ cell.ColumnSpan = 2;
+ if (footerTemplate != null)
+ footerTemplate.InstantiateIn (cell);
+ else
+ cell.Text = FooterText;
+ footerRow.Cells.Add (cell);
+ table.Rows.Add (footerRow);
+ }
return dataSource.DataSourceCount;
}
@@ -898,6 +1119,7 @@
{
DataControlRowState rstate = (index % 2) == 0 ?
DataControlRowState.Normal : DataControlRowState.Alternate;
if (CurrentMode == DetailsViewMode.Edit) rstate |=
DataControlRowState.Edit;
+ else if (CurrentMode == DetailsViewMode.Insert) rstate
|= DataControlRowState.Insert;
return rstate;
}
@@ -1086,9 +1308,13 @@
break;
case "Edit":
- EditRow ();
+ ChangeMode (DetailsViewMode.Edit);
break;
+ case "New":
+ ChangeMode (DetailsViewMode.Insert);
+ break;
+
case "Update":
UpdateItem (param, true);
break;
@@ -1100,6 +1326,10 @@
case "Delete":
DeleteItem ();
break;
+
+ case "Insert":
+ InsertItem (true);
+ break;
}
}
@@ -1114,12 +1344,13 @@
}
}
- void EditRow ()
+ public void ChangeMode (DetailsViewMode newMode)
{
- DetailsViewModeEventArgs args = new
DetailsViewModeEventArgs (DetailsViewMode.Edit, false);
+ DetailsViewModeEventArgs args = new
DetailsViewModeEventArgs (newMode, false);
OnModeChanging (args);
if (!args.Cancel) {
currentMode = args.NewMode;
+ OnModeChanged (EventArgs.Empty);
RequireBinding ();
}
}
@@ -1171,7 +1402,41 @@
return dargs.ExceptionHandled;
}
+
+ public virtual void InsertItem (bool causesValidation)
+ {
+ InsertItem (null, causesValidation);
+ }
+ void InsertItem (string param, bool causesValidation)
+ {
+ if (causesValidation)
+ Page.Validate ();
+
+ if (currentMode != DetailsViewMode.Insert) throw new
NotSupportedException ();
+
+ currentEditNewValues = GetRowValues (false, true);
+ DetailsViewInsertEventArgs args = new
DetailsViewInsertEventArgs (param, currentEditNewValues);
+ OnItemInserting (args);
+ if (!args.Cancel) {
+ DataSourceView view = GetData ();
+ if (view == null) throw new HttpException ("The
DataSourceView associated to data bound control was null");
+ view.Insert (currentEditNewValues, new
DataSourceViewOperationCallback (InsertCallback));
+ } else
+ EndRowEdit ();
+ }
+
+ bool InsertCallback (int recordsAffected, Exception exception)
+ {
+ DetailsViewInsertedEventArgs dargs = new
DetailsViewInsertedEventArgs (recordsAffected, exception, currentEditNewValues);
+ OnItemInserted (dargs);
+
+ if (!dargs.KeepInInsertMode)
+ EndRowEdit ();
+
+ return dargs.ExceptionHandled;
+ }
+
public void DeleteItem ()
{
currentEditRowKeys = DataKey.Values;
@@ -1201,7 +1466,7 @@
void EndRowEdit ()
{
- currentMode = DetailsViewMode.ReadOnly;
+ ChangeMode (DefaultMode);
oldEditValues = new DataKey (new OrderedDictionary ());
currentEditRowKeys = null;
currentEditOldValues = null;
@@ -1238,6 +1503,7 @@
if (pagerStyle != null)
((IStateManager)pagerStyle).TrackViewState();
if (rowStyle != null)
((IStateManager)rowStyle).TrackViewState();
if (editRowStyle != null)
((IStateManager)editRowStyle).TrackViewState();
+ if (insertRowStyle != null)
((IStateManager)insertRowStyle).TrackViewState();
if (emptyDataRowStyle != null)
((IStateManager)emptyDataRowStyle).TrackViewState();
if (key != null) ((IStateManager)key).TrackViewState();
if (autoFieldProperties != null) {
@@ -1257,6 +1523,7 @@
states[5] = (headerStyle == null ? null :
((IStateManager)headerStyle).SaveViewState());
states[6] = (pagerStyle == null ? null :
((IStateManager)pagerStyle).SaveViewState());
states[7] = (rowStyle == null ? null :
((IStateManager)rowStyle).SaveViewState());
+ states[8] = (insertRowStyle == null ? null :
((IStateManager)insertRowStyle).SaveViewState());
states[9] = (editRowStyle == null ? null :
((IStateManager)editRowStyle).SaveViewState());
states[10] = (emptyDataRowStyle == null ? null :
((IStateManager)emptyDataRowStyle).SaveViewState());
states[11] = (key == null ? null :
((IStateManager)key).SaveViewState());
@@ -1310,6 +1577,7 @@
if (states[5] != null)
((IStateManager)HeaderStyle).LoadViewState (states[5]);
if (states[6] != null)
((IStateManager)PagerStyle).LoadViewState (states[6]);
if (states[7] != null)
((IStateManager)RowStyle).LoadViewState (states[7]);
+ if (states[8] != null)
((IStateManager)InsertRowStyle).LoadViewState (states[8]);
if (states[9] != null)
((IStateManager)EditRowStyle).LoadViewState (states[9]);
if (states[10] != null)
((IStateManager)EmptyDataRowStyle).LoadViewState (states[10]);
if (states[11] != null)
((IStateManager)DataKey).LoadViewState (states[11]);
@@ -1428,22 +1696,26 @@
alternatingRowStyle.AddAttributesToRender (writer, row);
if ((row.RowState & DataControlRowState.Edit)
!= 0 && editRowStyle != null)
editRowStyle.AddAttributesToRender
(writer, row);
+ if ((row.RowState & DataControlRowState.Insert)
!= 0 && insertRowStyle != null)
+ insertRowStyle.AddAttributesToRender
(writer, row);
+
+ if (row == commandRow && commandRowStyle !=
null)
+ commandRowStyle.AddAttributesToRender
(writer, row);
row.RenderBeginTag (writer);
- foreach (TableCell cell in row.Cells) {
- DataControlFieldCell fcell = cell as
DataControlFieldCell;
+ for (int n=0; n<row.Cells.Count; n++) {
+ DataControlFieldCell fcell =
row.Cells[n] as DataControlFieldCell;
if (fcell != null) {
- Style cellStyle = null;
- switch (row.RowType) {
- case
DataControlRowType.Header: cellStyle = fcell.ContainingField.HeaderStyle; break;
- case
DataControlRowType.Footer: cellStyle = fcell.ContainingField.FooterStyle; break;
- default: cellStyle =
fcell.ContainingField.ItemStyle; break;
+ if (n == 0 &&
fcell.ContainingField.ShowHeader) {
+ if (fieldHeaderStyle !=
null)
+
fieldHeaderStyle.AddAttributesToRender (writer, fcell);
+
fcell.ContainingField.HeaderStyle.AddAttributesToRender (writer, fcell);
}
- if (cellStyle != null)
-
cellStyle.AddAttributesToRender (writer, cell);
+ else
+
fcell.ContainingField.ItemStyle.AddAttributesToRender (writer, fcell);
}
- cell.Render (writer);
+ fcell.Render (writer);
}
row.RenderEndTag (writer);
}
Modified:
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsViewInsertEventArgs.cs
===================================================================
---
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsViewInsertEventArgs.cs
2005-04-14 12:22:26 UTC (rev 42996)
+++
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsViewInsertEventArgs.cs
2005-04-14 12:24:07 UTC (rev 42997)
@@ -38,18 +38,25 @@
public class DetailsViewInsertEventArgs : CancelEventArgs
{
private object argument;
+ private IOrderedDictionary values;
public DetailsViewInsertEventArgs (object argument)
{
this.argument = argument;
}
+ internal DetailsViewInsertEventArgs (object argument,
IOrderedDictionary values)
+ {
+ this.argument = argument;
+ this.values = values;
+ }
+
public object CommandArgument {
get { return argument; }
}
public IOrderedDictionary Values {
- get { throw new NotImplementedException(); }
+ get { return values; }
}
}
}
Modified:
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsViewInsertedEventArgs.cs
===================================================================
---
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsViewInsertedEventArgs.cs
2005-04-14 12:22:26 UTC (rev 42996)
+++
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsViewInsertedEventArgs.cs
2005-04-14 12:24:07 UTC (rev 42997)
@@ -40,6 +40,7 @@
private Exception e;
private bool exceptionHandled;
private bool keepInsertedMode;
+ private IOrderedDictionary values;
public DetailsViewInsertedEventArgs (int affectedRows,
Exception e)
{
@@ -49,6 +50,11 @@
this.keepInsertedMode = false;
}
+ public DetailsViewInsertedEventArgs (int affectedRows,
Exception e, IOrderedDictionary values): this (affectedRows, e)
+ {
+ this.values = values;
+ }
+
public int AffectedRows {
get { return rowsAffected; }
}
@@ -68,7 +74,7 @@
}
public IOrderedDictionary Values {
- get { throw new NotImplementedException(); }
+ get { return values; }
}
}
}
Modified: trunk/mcs/class/System.Web/System.Web.UI.WebControls/ImageField.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/ImageField.cs
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/ImageField.cs
2005-04-14 12:24:07 UTC (rev 42997)
@@ -188,7 +188,8 @@
{
if ((ReadOnly && !includeReadOnly) ||
cell.Controls.Count == 0) return;
- if ((rowState & DataControlRowState.Edit) != 0 &&
!ReadOnly) {
+ bool editable = (rowState & (DataControlRowState.Edit |
DataControlRowState.Insert)) != 0;
+ if (editable && !ReadOnly) {
TextBox box = cell.Controls [0] as TextBox;
dictionary [DataImageUrlField] = box.Text;
} else if (includeReadOnly) {
@@ -208,7 +209,8 @@
public virtual void InitializeDataCell (DataControlFieldCell
cell, DataControlRowState rowState)
{
- if ((rowState & DataControlRowState.Edit) != 0 &&
!ReadOnly) {
+ bool editable = (rowState & (DataControlRowState.Edit |
DataControlRowState.Insert)) != 0;
+ if (editable && !ReadOnly) {
TextBox box = new TextBox ();
cell.Controls.Add (box);
} else {
Modified:
trunk/mcs/class/System.Web/System.Web.UI.WebControls/ObjectDataSource.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/ObjectDataSource.cs
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/ObjectDataSource.cs
2005-04-14 12:24:07 UTC (rev 42997)
@@ -308,6 +308,20 @@
return DefaultView.Insert (empty);
}
+ protected override void OnInit (EventArgs e)
+ {
+ Page.LoadComplete += OnPageLoadComplete;
+ }
+
+ void OnPageLoadComplete (object sender, EventArgs e)
+ {
+ DeleteParameters.UpdateValues (Context, this);
+ FilterParameters.UpdateValues (Context, this);
+ InsertParameters.UpdateValues (Context, this);
+ SelectParameters.UpdateValues (Context, this);
+ UpdateParameters.UpdateValues (Context, this);
+ }
+
protected override void LoadViewState (object savedState)
{
if (savedState == null) {
Modified:
trunk/mcs/class/System.Web/System.Web.UI.WebControls/ObjectDataSourceView.cs
===================================================================
---
trunk/mcs/class/System.Web/System.Web.UI.WebControls/ObjectDataSourceView.cs
2005-04-14 12:22:26 UTC (rev 42996)
+++
trunk/mcs/class/System.Web/System.Web.UI.WebControls/ObjectDataSourceView.cs
2005-04-14 12:24:07 UTC (rev 42997)
@@ -699,16 +699,13 @@
dview.Sort = arguments.SortExpression;
}
if (FilterExpression.Length > 0) {
- OrderedDictionary fparams = new
OrderedDictionary ();
- foreach (Parameter p in
FilterParameters)
- fparams.Add (p.Name,
ConvertParameter (p.Type, p.GetValue (context, owner)));
-
+ IOrderedDictionary fparams =
FilterParameters.GetValues (context, owner);
ObjectDataSourceFilteringEventArgs
fargs = new ObjectDataSourceFilteringEventArgs (fparams);
OnFiltering (fargs);
if (!fargs.Cancel) {
- object[] formatValues = new
object[fargs.ParameterValues.Count];
+ object[] formatValues = new
object [fparams.Count];
for (int n=0;
n<formatValues.Length; n++) {
- formatValues [n] =
fargs.ParameterValues [n];
+ formatValues [n] =
fparams [n];
if (formatValues [n] ==
null) return dview;
}
dview.RowFilter = string.Format
(FilterExpression, formatValues);
@@ -936,25 +933,21 @@
object ConvertParameter (Type targetType, object value)
{
- if (value == null) {
- if (targetType.IsPrimitive)
- value = 0;
- else if (targetType == typeof(object) &&
ConvertNullToDBNull)
- return DBNull.Value;
- }
- return Convert.ChangeType (value, targetType);
+ return ConvertParameter (Type.GetTypeCode (targetType),
value);
}
object ConvertParameter (TypeCode targetType, object value)
{
- Console.WriteLine ("ConvertParameter:" + value);
if (value == null) {
if (targetType != TypeCode.Object && targetType
!= TypeCode.String)
value = 0;
else if (targetType == TypeCode.Object &&
ConvertNullToDBNull)
return DBNull.Value;
}
- return Convert.ChangeType (value, targetType);
+ if (targetType == TypeCode.Object)
+ return value;
+ else
+ return Convert.ChangeType (value, targetType);
}
string FormatOldParameter (string name)
@@ -968,7 +961,6 @@
void OnParametersChanged (object sender, EventArgs args)
{
- Console.WriteLine ("OnParametersChanged");
OnDataSourceViewChanged (EventArgs.Empty);
}
Modified: trunk/mcs/class/System.Web/System.Web.UI.WebControls/Parameter.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/Parameter.cs
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/Parameter.cs
2005-04-14 12:24:07 UTC (rev 42997)
@@ -82,17 +82,12 @@
protected virtual void LoadViewState (object savedState)
{
- if (savedState == null)
- return;
-
ViewState.LoadViewState (savedState);
}
protected virtual object SaveViewState ()
{
- if (viewState == null)
- return null;
- return viewState.SaveViewState ();
+ return ViewState.SaveViewState ();
}
protected virtual void TrackViewState ()
@@ -126,10 +121,9 @@
get { return this.IsTrackingViewState; }
}
- [MonoTODO]
public override string ToString ()
{
- return base.ToString ();
+ return Name;
}
[WebCategoryAttribute ("Parameter"), DefaultValueAttribute (""),
@@ -196,7 +190,7 @@
if (o != null)
return (bool) o;
- return false;
+ return true;
}
set {
if (ConvertEmptyStringToNull != value) {
@@ -254,12 +248,30 @@
internal object GetValue (HttpContext context, Control control)
{
- return Evaluate (context, control);
- }
+ object oldValue = ViewState ["ParameterValue"];
+
+ object newValue = ConvertValue (Evaluate (context,
control));
+ if (newValue == null)
+ newValue = ConvertValue (DefaultValue);
+ if (!object.Equals (oldValue, newValue)) {
+ ViewState ["ParameterValue"] = newValue;
+ OnParameterChanged ();
+ }
+ return newValue;
+ }
+
+ object ConvertValue (object val)
+ {
+ if (val == null) return null;
+ if (ConvertEmptyStringToNull && val.Equals
(string.Empty))
+ return null;
+ return Convert.ChangeType (val, Type);
+ }
+
protected internal virtual void SetDirty()
{
- this.SaveViewState();
+ ViewState.SetDirty ();
}
@@ -269,22 +281,6 @@
{
_owner = own;
}
-
- internal object ParameterValue {
- get {
- object param = ViewState["ParameterValue"];
- //FIXME: need to do some null string checking
magic with TreatEmptyStringAsNull here
- if (param == null)
- {
- param = DefaultValue;
- if (param == null)
- {
- return null;
- }
- }
- return Convert.ChangeType (param, Type);
- }
- }
}
}
#endif
Modified:
trunk/mcs/class/System.Web/System.Web.UI.WebControls/ParameterCollection.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/ParameterCollection.cs
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/ParameterCollection.cs
2005-04-14 12:24:07 UTC (rev 42997)
@@ -47,9 +47,7 @@
typeof (SessionParameter) };
private EventHandler _parametersChanged;
- private KeyedList _values;
-
public int Add (Parameter param)
{
return ((IList)this).Add (param);
@@ -90,25 +88,25 @@
return _knownTypes;
}
- [MonoTODO ("Take care of HTTPContext parameter")]
public IOrderedDictionary GetValues (HttpContext context,
Control control)
{
- if (_values == null)
+ OrderedDictionary values = new OrderedDictionary ();
+ foreach (Parameter param in this)
{
- _values = new KeyedList ();
- foreach (Parameter param in this)
- {
- string name = param.Name;
- for (int i = 1; _values.Contains
(name); i++)
- {
- name = param.Name + i.ToString
();
- }
- _values.Add (name,
param.ParameterValue);
- }
+ string name = param.Name;
+ for (int i = 1; values.Contains (name); i++)
+ name = param.Name + i.ToString ();
+ values.Add (name, param.GetValue (context,
control));
}
- return _values;
+ return values;
}
+ public void UpdateValues (HttpContext context, Control control)
+ {
+ foreach (Parameter param in this)
+ param.GetValue (context, control);
+ }
+
public void Insert (int idx, Parameter param)
{
((IList)this).Insert (idx, param);
@@ -136,8 +134,6 @@
{
if (_parametersChanged != null)
_parametersChanged(this, e);
-
- _values = null;
}
protected override void OnValidate (object o)
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches