Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Kharmatsky <ilya@mono-cvs.ximian.com>2007-01-24 12:57:22 +0300
committerIlya Kharmatsky <ilya@mono-cvs.ximian.com>2007-01-24 12:57:22 +0300
commit0a1d87626b0206b89baa1d85e93f48ba546f25c9 (patch)
tree81ab7c987e521807c49dc85275cf38f8755a726b
parent6a367705b334c4e175cb2eb7796f9e46b18452cb (diff)
Fixed rendering problems in DetailsView control, related to an empty data source.
svn path=/trunk/mcs/; revision=71582
-rw-r--r--mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog6
-rw-r--r--mcs/class/System.Web/System.Web.UI.WebControls/DetailsView.cs161
-rw-r--r--mcs/class/System.Web/Test/System.Web.UI.WebControls/ChangeLog7
-rw-r--r--mcs/class/System.Web/Test/System.Web.UI.WebControls/DetailsViewTest.cs136
4 files changed, 245 insertions, 65 deletions
diff --git a/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog b/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog
index d671f625200..5d9991f75bc 100644
--- a/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog
+++ b/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog
@@ -1,3 +1,9 @@
+2007-01-24 Ilya Kharmatsky <ilya -at- decode-systems.com>
+
+ * DetailsView.cs: fixed problems with rendering of control, when
+ empty data source is provided. Respective tests are provided
+ in DetailsViewTest.cs
+
2007-01-21 Konstantin Triger <kostat@mainsoft.com>
* TreeView.js, DetailsView.js, Menu.js, GridView.js:
diff --git a/mcs/class/System.Web/System.Web.UI.WebControls/DetailsView.cs b/mcs/class/System.Web/System.Web.UI.WebControls/DetailsView.cs
index df03b0805cc..02ac59596b4 100644
--- a/mcs/class/System.Web/System.Web.UI.WebControls/DetailsView.cs
+++ b/mcs/class/System.Web/System.Web.UI.WebControls/DetailsView.cs
@@ -1110,8 +1110,7 @@ namespace System.Web.UI.WebControls
bool showPager = AllowPaging && (PageCount > 1);
Controls.Clear ();
- table = CreateTable ();
- Controls.Add (table);
+ table = null;
ArrayList list = new ArrayList ();
@@ -1136,57 +1135,72 @@ namespace System.Web.UI.WebControls
}
// Main table creation
-
- headerRow = CreateRow (-1, DataControlRowType.Header, DataControlRowState.Normal);
- DataControlFieldCell headerCell = new DataControlFieldCell (null);
- headerCell.ColumnSpan = 2;
- if (headerTemplate != null)
- headerTemplate.InstantiateIn (headerCell);
- else
- headerCell.Text = HeaderText;
- headerRow.Cells.Add (headerCell);
- table.Rows.Add (headerRow);
-
- if (showPager && PagerSettings.Position == PagerPosition.Top || PagerSettings.Position == PagerPosition.TopAndBottom) {
- topPagerRow = CreateRow (-1, DataControlRowType.Pager, DataControlRowState.Normal);
- InitializePager (topPagerRow, dataSource);
- table.Rows.Add (topPagerRow);
- }
-
- if (dataSource.Count > 0) {
- foreach (DataControlField field in fields) {
- DataControlRowState rstate = GetRowState (list.Count);
- DetailsViewRow row = CreateRow (PageIndex, DataControlRowType.DataRow, rstate);
- InitializeRow (row, field);
- table.Rows.Add (row);
- list.Add (row);
- }
- } else {
- table.Rows.Add (CreateEmptyrRow ());
- }
-
- rows = new DetailsViewRowCollection (list);
- footerRow = CreateRow (-1, DataControlRowType.Footer, DataControlRowState.Normal);
- DataControlFieldCell footerCell = new DataControlFieldCell (null);
- footerCell.ColumnSpan = 2;
- if (footerTemplate != null)
- footerTemplate.InstantiateIn (footerCell);
- else
- footerCell.Text = FooterText;
- footerRow.Cells.Add (footerCell);
- table.Rows.Add (footerRow);
-
- if (showPager && PagerSettings.Position == PagerPosition.Bottom || PagerSettings.Position == PagerPosition.TopAndBottom) {
- bottomPagerRow = CreateRow (-1, DataControlRowType.Pager, DataControlRowState.Normal);
- InitializePager (bottomPagerRow, dataSource);
- table.Rows.Add (bottomPagerRow);
- }
-
- if (dataBinding)
- DataBind (false);
-
- return dataSource.DataSourceCount;
+ bool hasEmptyText = EmptyDataText != null && EmptyDataText != String.Empty;
+
+ if (fields.Length > 0)
+ {
+ headerRow = CreateRow(-1, DataControlRowType.Header, DataControlRowState.Normal);
+ DataControlFieldCell headerCell = new DataControlFieldCell(null);
+ headerCell.ColumnSpan = 2;
+ if (headerTemplate != null)
+ headerTemplate.InstantiateIn(headerCell);
+ else
+ headerCell.Text = HeaderText;
+ headerRow.Cells.Add(headerCell);
+ ContainedTable.Rows.Add(headerRow);
+
+ if (showPager && PagerSettings.Position == PagerPosition.Top ||
+ PagerSettings.Position == PagerPosition.TopAndBottom)
+ {
+ topPagerRow = CreateRow(-1, DataControlRowType.Pager, DataControlRowState.Normal);
+ InitializePager(topPagerRow, dataSource);
+ ContainedTable.Rows.Add(topPagerRow);
+ }
+ }
+
+ foreach (DataControlField field in fields)
+ {
+ DataControlRowState rstate = GetRowState(list.Count);
+ DetailsViewRow row = CreateRow(PageIndex, DataControlRowType.DataRow, rstate);
+ InitializeRow(row, field);
+ ContainedTable.Rows.Add(row);
+ list.Add(row);
+ }
+
+ rows = new DetailsViewRowCollection(list);
+
+ if (list.Count == 0 && hasEmptyText)
+ {
+ ContainedTable.Rows.Add(CreateEmptyRow());
+ }
+
+ if (list.Count > 0)
+ {
+ footerRow = CreateRow(-1, DataControlRowType.Footer, DataControlRowState.Normal);
+ DataControlFieldCell footerCell = new DataControlFieldCell(null);
+ footerCell.ColumnSpan = 2;
+ if (footerTemplate != null)
+ footerTemplate.InstantiateIn(footerCell);
+ else
+ footerCell.Text = FooterText;
+
+ footerRow.Cells.Add(footerCell);
+ ContainedTable.Rows.Add(footerRow);
+
+ if (showPager && PagerSettings.Position == PagerPosition.Bottom ||
+ PagerSettings.Position == PagerPosition.TopAndBottom)
+ {
+ bottomPagerRow = CreateRow(-1, DataControlRowType.Pager, DataControlRowState.Normal);
+ InitializePager(bottomPagerRow, dataSource);
+ ContainedTable.Rows.Add(bottomPagerRow);
+ }
+ }
+
+ if (dataBinding)
+ DataBind(false);
+
+ return dataSource.DataSourceCount;
}
protected override void EnsureDataBound ()
@@ -1215,7 +1229,7 @@ namespace System.Web.UI.WebControls
row.Cells.Add (cell);
}
- DetailsViewRow CreateEmptyrRow ()
+ DetailsViewRow CreateEmptyRow ()
{
DetailsViewRow row = CreateRow (-1, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
TableCell cell = new TableCell ();
@@ -1325,19 +1339,23 @@ namespace System.Web.UI.WebControls
protected internal virtual void PrepareControlHierarchy ()
{
- if (table == null)
- return;
-
- table.Caption = Caption;
- table.CaptionAlign = CaptionAlign;
+ ContainedTable.Caption = Caption;
+ ContainedTable.CaptionAlign = CaptionAlign;
// set visible for header and footer
- TableCell headerCell = (TableCell) HeaderRow.Controls [0];
- HeaderRow.Visible = headerCell.Text.Length > 0 || headerCell.Controls.Count > 0;
- TableCell footerCell = (TableCell) FooterRow.Controls [0];
- FooterRow.Visible = footerCell.Text.Length > 0 || footerCell.Controls.Count > 0;
+ if (HeaderRow != null)
+ {
+ TableCell headerCell = (TableCell) HeaderRow.Controls [0];
+ HeaderRow.Visible = headerCell.Text.Length > 0 || headerCell.Controls.Count > 0;
+ }
+ if (FooterRow != null)
+ {
+ TableCell footerCell = (TableCell) FooterRow.Controls [0];
+ FooterRow.Visible = footerCell.Text.Length > 0 || footerCell.Controls.Count > 0;
+ }
- foreach (DetailsViewRow row in table.Rows) {
+ foreach (DetailsViewRow row in ContainedTable.Rows)
+ {
switch (row.RowType) {
case DataControlRowType.Header:
if (headerStyle != null && !headerStyle.IsEmpty)
@@ -1916,8 +1934,21 @@ namespace System.Web.UI.WebControls
table.Render (writer);
}
- PostBackOptions IPostBackContainer.GetPostBackOptions (IButtonControl control)
- {
+ private Table ContainedTable
+ {
+ get
+ {
+ if (table == null)
+ {
+ table = CreateTable();
+ Controls.Add(table);
+ }
+ return table;
+ }
+ }
+
+ PostBackOptions IPostBackContainer.GetPostBackOptions(IButtonControl control)
+ {
if (control == null)
throw new ArgumentNullException ("control");
diff --git a/mcs/class/System.Web/Test/System.Web.UI.WebControls/ChangeLog b/mcs/class/System.Web/Test/System.Web.UI.WebControls/ChangeLog
index 24fd92cae77..878b5458e47 100644
--- a/mcs/class/System.Web/Test/System.Web.UI.WebControls/ChangeLog
+++ b/mcs/class/System.Web/Test/System.Web.UI.WebControls/ChangeLog
@@ -1,3 +1,10 @@
+2007-01-24 Ilya Kharmatsky <ilya -at- decode-systems.com>
+
+ * DetailsViewTest.cs : added 3 tests, which test rendering of
+ control, when data source is empty - it should not contain
+ header or footer,even when the values are provided for those
+ properties.
+
2007-01-15 Ilya Kharmatsky <ilya -at- decode-systems.com>
* CheckBoxListTest.cs
diff --git a/mcs/class/System.Web/Test/System.Web.UI.WebControls/DetailsViewTest.cs b/mcs/class/System.Web/Test/System.Web.UI.WebControls/DetailsViewTest.cs
index f6429d6165f..84af7b64da0 100644
--- a/mcs/class/System.Web/Test/System.Web.UI.WebControls/DetailsViewTest.cs
+++ b/mcs/class/System.Web/Test/System.Web.UI.WebControls/DetailsViewTest.cs
@@ -604,7 +604,143 @@ namespace MonoTests.System.Web.UI.WebControls
Assert.AreEqual (true, origHtmlValue.Contains ("Blue_hills.jpg"), "BackImageRender");
//GridLines and HorizontalAlign were set but can not be shown in this rendering.
}
+
+ ///
+ /// The test checks, that when the DataSource is empty, the control
+ /// will not render the content even when footer/header are set to some
+ /// values.
+ ///
+ [Test]
+ [Category ("NunitWeb")]
+ public void DetailsView_EmptyContentRendering()
+ {
+ PageDelegate pd = new PageDelegate (DetailsView_EmptyContentRendering_Load);
+ WebTest t = new WebTest (PageInvoker.CreateOnLoad (pd));
+ string result = t.Run ();
+ FormRequest fr = new FormRequest (t.Response, "form1");
+ fr.Controls.Add ("__EVENTTARGET");
+ fr.Controls.Add ("__EVENTARGUMENT");
+ fr.Controls["__EVENTTARGET"].Value = "LinkButton1";
+ fr.Controls["__EVENTARGUMENT"].Value = "";
+ t.Request = fr;
+ result = t.Run ();
+ string newHtml = HtmlDiff.GetControlFromPageHtml (result);
+ string origHtml=@"<div>
+ <table cellspacing=""0"" rules=""all"" border=""1"" style=""border-collapse:collapse;"">
+ </table>
+ </div><a id=""LinkButton1"" href=""javascript:__doPostBack('LinkButton1','')"">Test</a>";
+ HtmlDiff.AssertAreEqual(origHtml, newHtml, "EmptyContentTest");
+ }
+
+ public static void DetailsView_EmptyContentRendering_Load(Page p)
+ {
+ LiteralControl lcb = new LiteralControl (HtmlDiff.BEGIN_TAG);
+ LiteralControl lce = new LiteralControl (HtmlDiff.END_TAG);
+
+ PokerDetailsView dv = new PokerDetailsView ();
+ dv.DataSource = new ArrayList ();
+ dv.HeaderText = "Header Text";
+ dv.FooterText = "Footer Text";
+ LinkButton lb = new LinkButton ();
+ lb.ID = "LinkButton1";
+ lb.Text = "Test";
+
+ p.Form.Controls.Add (lcb);
+ p.Form.Controls.Add (dv);
+ dv.DataBind ();
+ p.Form.Controls.Add (lb);
+ p.Form.Controls.Add (lce);
+ }
+
+ ///
+ /// This test checks, that when the footer text is set, but
+ /// the DataSource is empty, the footer is not rendered.
+ ///
+ [Test]
+ [Category ("NunitWeb")]
+ public void DetailsView_EmptyFooterRendering()
+ {
+ PageDelegate pd = new PageDelegate (DetailsView_EmptyFooterRendering_Load);
+ WebTest t = new WebTest (PageInvoker.CreateOnLoad (pd));
+ string result = t.Run ();
+ FormRequest fr = new FormRequest (t.Response, "form1");
+ fr.Controls.Add ("__EVENTTARGET");
+ fr.Controls.Add ("__EVENTARGUMENT");
+ fr.Controls["__EVENTTARGET"].Value = "LinkButton1";
+ fr.Controls["__EVENTARGUMENT"].Value = "";
+ t.Request = fr;
+ result = t.Run ();
+ string newHtml = HtmlDiff.GetControlFromPageHtml (result);
+ string origHtml=@"<div>
+ <table cellspacing=""0"" rules=""all"" border=""1"" style=""border-collapse:collapse;"">
+ </table>
+ </div><a id=""LinkButton1"" href=""javascript:__doPostBack('LinkButton1','')"">Test</a>";
+ HtmlDiff.AssertAreEqual(origHtml, newHtml, "EmptyFooterTextTest");
+ }
+
+ public static void DetailsView_EmptyFooterRendering_Load(Page p)
+ {
+ LiteralControl lcb = new LiteralControl (HtmlDiff.BEGIN_TAG);
+ LiteralControl lce = new LiteralControl (HtmlDiff.END_TAG);
+
+ PokerDetailsView dv = new PokerDetailsView ();
+ dv.DataSource = new ArrayList ();
+ dv.FooterText = "Footer Text";
+ LinkButton lb = new LinkButton ();
+ lb.ID = "LinkButton1";
+ lb.Text = "Test";
+
+ p.Form.Controls.Add (lcb);
+ p.Form.Controls.Add (dv);
+ dv.DataBind ();
+ p.Form.Controls.Add (lb);
+ p.Form.Controls.Add (lce);
+ }
+
+ ///
+ /// This test checks, that when the header text is set, but
+ /// the DataSource is empty, the header is not rendered
+ ///
+ [Test]
+ [Category ("NunitWeb")]
+ public void DetailsView_EmptyHeaderRendering()
+ {
+ PageDelegate pd = new PageDelegate (DetailsView_EmptyHeaderRendering_Load);
+ WebTest t = new WebTest (PageInvoker.CreateOnLoad (pd));
+ string result = t.Run ();
+ FormRequest fr = new FormRequest (t.Response, "form1");
+ fr.Controls.Add ("__EVENTTARGET");
+ fr.Controls.Add ("__EVENTARGUMENT");
+ fr.Controls["__EVENTTARGET"].Value = "LinkButton1";
+ fr.Controls["__EVENTARGUMENT"].Value = "";
+ t.Request = fr;
+ result = t.Run ();
+ string newHtml = HtmlDiff.GetControlFromPageHtml (result);
+ string origHtml=@"<div>
+ <table cellspacing=""0"" rules=""all"" border=""1"" style=""border-collapse:collapse;"">
+ </table>
+ </div><a id=""LinkButton1"" href=""javascript:__doPostBack('LinkButton1','')"">Test</a>";
+ HtmlDiff.AssertAreEqual(origHtml, newHtml, "EmptyHeaderTextTest");
+ }
+
+ public static void DetailsView_EmptyHeaderRendering_Load(Page p)
+ {
+ LiteralControl lcb = new LiteralControl (HtmlDiff.BEGIN_TAG);
+ LiteralControl lce = new LiteralControl (HtmlDiff.END_TAG);
+ PokerDetailsView dv = new PokerDetailsView ();
+ dv.DataSource = new ArrayList ();
+ dv.HeaderText = "Header Text";
+ LinkButton lb = new LinkButton ();
+ lb.ID = "LinkButton1";
+ lb.Text = "Test";
+
+ p.Form.Controls.Add (lcb);
+ p.Form.Controls.Add (dv);
+ dv.DataBind ();
+ p.Form.Controls.Add (lb);
+ p.Form.Controls.Add (lce);
+ }
[Test]
[Category ("NunitWeb")]