protected string GenerateSavedSearch(bool bDefaultSearch) { XmlDocument xml = new XmlDocument(); xml.AppendChild(xml.CreateXmlDeclaration("1.0", "UTF-8", null)); XmlNode xSavedSearch = xml.CreateElement("SavedSearch"); xml.AppendChild(xSavedSearch); if (dtFields != null) { if (bDefaultSearch) { // 12/14/2007 Paul. Although it might be better to use events to get the sort field, // that could cause an endless loop as this control sets the sort field and retrieves the sort field. SplendidGrid grdMain = Parent.FindControl(sGridID) as SplendidGrid; if (grdMain != null) { if (!String.IsNullOrEmpty(grdMain.SortColumn)) { XmlNode xSortColumn = xml.CreateElement("SortColumn"); xSavedSearch.AppendChild(xSortColumn); xSortColumn.InnerText = grdMain.SortColumn; } if (!String.IsNullOrEmpty(grdMain.SortOrder)) { XmlNode xSortOrder = xml.CreateElement("SortOrder"); xSavedSearch.AppendChild(xSortOrder); xSortOrder.InnerText = grdMain.SortOrder; } } if (!Sql.IsEmptyString(lstSavedSearches.SelectedValue)) { XmlNode xDefaultSearch = xml.CreateElement("DefaultSearch"); xSavedSearch.AppendChild(xDefaultSearch); xDefaultSearch.InnerText = lstSavedSearches.SelectedValue; } } else { if (!Sql.IsEmptyString(lstColumns.SelectedValue)) { XmlNode xSortColumn = xml.CreateElement("SortColumn"); xSavedSearch.AppendChild(xSortColumn); xSortColumn.InnerText = lstColumns.SelectedValue; } if (radSavedSearchASC.Checked || radSavedSearchDESC.Checked) { XmlNode xSortOrder = xml.CreateElement("SortOrder"); xSavedSearch.AppendChild(xSortOrder); if (radSavedSearchASC.Checked) { xSortOrder.InnerText = "asc"; } else if (radSavedSearchDESC.Checked) { xSortOrder.InnerText = "desc"; } } } XmlNode xSearchFields = xml.CreateElement("SearchFields"); xSavedSearch.AppendChild(xSearchFields); foreach (DataRowView row in dtFields.DefaultView) { string sFIELD_TYPE = Sql.ToString(row["FIELD_TYPE"]); string sDATA_FIELD = Sql.ToString(row["DATA_FIELD"]); string sDISPLAY_FIELD = Sql.ToString(row["DISPLAY_FIELD"]); int nFORMAT_MAX_LENGTH = Sql.ToInteger(row["FORMAT_MAX_LENGTH"]); int nFORMAT_ROWS = Sql.ToInteger(row["FORMAT_ROWS"]); // 12/07/2007 Paul. Create the field but don't append it unless it is used. // This is how we will distinguish from unspecified field. XmlNode xField = xml.CreateElement("Field"); XmlUtil.SetSingleNodeAttribute(xml, xField, "Name", sDATA_FIELD); XmlUtil.SetSingleNodeAttribute(xml, xField, "Type", sFIELD_TYPE); DynamicControl ctl = new DynamicControl(this, sDATA_FIELD); if (ctl != null) { if (sFIELD_TYPE == "ListBox") { ListControl lst = FindControl(sDATA_FIELD) as ListControl; if (lst != null) { if (lst is ListBox) { int nSelected = 0; foreach (ListItem item in lst.Items) { if (item.Selected) { nSelected++; } } if (nSelected > 0) { xSearchFields.AppendChild(xField); foreach (ListItem item in lst.Items) { if (item.Selected) { XmlNode xValue = xml.CreateElement("Value"); xField.AppendChild(xValue); xValue.InnerText = item.Value; } } } } else if (lst is DropDownList) { // 12/13/2007 Paul. DropDownLists must be handled separately to ensure that only one item is selected. xField.InnerText = lst.SelectedValue; } } } else if (sFIELD_TYPE == "DatePicker") { DatePicker ctlDate = FindControl(sDATA_FIELD) as DatePicker; if (ctlDate != null) { if (!Sql.IsEmptyString(ctlDate.DateText)) { xSearchFields.AppendChild(xField); xField.InnerText = ctlDate.DateText; } } } else if (sFIELD_TYPE == "DateRange") { DatePicker ctlDateStart = FindControl(sDATA_FIELD + "_AFTER") as DatePicker; if (ctlDateStart != null) { if (!Sql.IsEmptyString(ctlDateStart.DateText)) { xSearchFields.AppendChild(xField); XmlUtil.SetSingleNode(xml, xField, "After", ctlDateStart.DateText); } } DatePicker ctlDateEnd = FindControl(sDATA_FIELD + "_BEFORE") as DatePicker; if (ctlDateEnd != null) { if (!Sql.IsEmptyString(ctlDateEnd.DateText)) { xSearchFields.AppendChild(xField); XmlUtil.SetSingleNode(xml, xField, "Before", ctlDateEnd.DateText); } } } else if (sFIELD_TYPE == "CheckBox") { if (ctl.Checked) { xSearchFields.AppendChild(xField); xField.InnerText = "true"; } } else if (sFIELD_TYPE == "TextBox") { ctl.Text = ctl.Text.Trim(); if (!Sql.IsEmptyString(ctl.Text)) { xSearchFields.AppendChild(xField); xField.InnerText = ctl.Text; } } else if (sFIELD_TYPE == "ChangeButton") { ctl.Text = ctl.Text.Trim(); if (!Sql.IsEmptyString(ctl.Text)) { xSearchFields.AppendChild(xField); xField.InnerText = ctl.Text; } // 12/08/2007 Paul. Save the display field as a separate XML node. // Treat it as a text box and it will get populated just like any other search field. DynamicControl ctlDISPLAY_FIELD = new DynamicControl(this, sDISPLAY_FIELD); if (ctlDISPLAY_FIELD != null) { ctlDISPLAY_FIELD.Text = ctlDISPLAY_FIELD.Text.Trim(); xField = xml.CreateElement("Field"); XmlUtil.SetSingleNodeAttribute(xml, xField, "Name", sDISPLAY_FIELD); XmlUtil.SetSingleNodeAttribute(xml, xField, "Type", "TextBox"); if (!Sql.IsEmptyString(ctlDISPLAY_FIELD.Text)) { xSearchFields.AppendChild(xField); xField.InnerText = ctlDISPLAY_FIELD.Text; } } } } } } return(xml.OuterXml); }