Hi,
I've used part of this customcontrol in the past to make a
footerrow
with insert functionality display/work when the gridview is empty. This
has always worked great. Buttons and textboxes in the footer cuold
always be used normaly when an empty gridview was encountered.
Now I've got some search functionalty
embedded in the header and I'm using this customcontrol to show the
gridview when it is empty.
This time it's
not working though.
When an empty gridview
is returned after a search has been done, the searchbutton and
textboxes are shown. The sort-links returned by the GetHeader are not
however. It seems the header never gets initialized properly when a
search doesn't have any results. When a new search is performed after
an empty search, a postback occurs, but the RowCommand is never called.
I've found that the properties HeaderText and SortExpression of the
templatefield are not used when the templatefield contains a
HeaderTemplate. Therefor the build-in functionality of sorting could
not be used. The GetHeader function is for creating the sort-link in
the header.
Because
the search-textboxes are within the gridview, they do not automatically
persist their value during postbacks. I've come up with a way to
dynamically build and fill the filter parameters and expression and use
this to persist (re-fill) the search fields.
I'm using caching and filterparameters to fill and search the data in the gridview.
My Code:
protected override int CreateChildControls:
Same as above (minus FreezeHeader, I'm using only the ShowWhenEmpty functionality)
SelectMethod (because of caching only called when necessary):
public DataSet gvOrderList_Select(string sort)
{
string sql = "SELECT O.*, OS.Status AS StatusNaam, K.Achternaam FROM (ORDER O LEFT JOIN OrderStatus OS ON O.Status = OS.Id) LEFT JOIN Klant K ON O.KlantId = K.Id";
if (!string.IsNullOrEmpty(sort))
{
if (sort.Contains("IngangsDatum"))
sort = sort.Replace("IngangsDatum", "O.IngangsDatum");
if (sort.Contains("Status"))
sort = sort.Replace("Status", "O.Status");
sql += " ORDER BY " + sort + ";";
}
else
sql += " ORDER BY O.IngangsDatum DESC;";
DataSet ds = db.Select(sql);
HttpContext.Current.Cache["CacheodsOrderList"] = ds;
return ds;
}
OnRowCommand:
protected void gvOrderList_RowCommand(object sender, GridViewCommandEventArgs e)
{
switch (e.CommandName)
{
case "new":
break;
case "edit":
break;
case "del":
break;
case "search":
string search;
odsOrderList.FilterParameters.Clear();
search = ((TextBox)gvOrderList.HeaderRow.FindControl("tbSearchOrdernummer")).Text;
if (!string.IsNullOrEmpty(search))
odsOrderList.FilterParameters.Add("Ordernummer", search);
search = ((TextBox)gvOrderList.HeaderRow.FindControl("tbSearchDatumVan")).Text;
if (!string.IsNullOrEmpty(search))
odsOrderList.FilterParameters.Add("DatumVan", TypeCode.DateTime, search);
search = ((TextBox)gvOrderList.HeaderRow.FindControl("tbSearchDatumTot")).Text;
if (!string.IsNullOrEmpty(search))
odsOrderList.FilterParameters.Add("DatumTot", TypeCode.DateTime, search);
search = ((TextBox)gvOrderList.HeaderRow.FindControl("tbSearchAchternaam")).Text;
if (!string.IsNullOrEmpty(search))
odsOrderList.FilterParameters.Add("Achternaam", search);
search = ((DropDownList)gvOrderList.HeaderRow.FindControl("ddlSearchStatus")).SelectedValue;
if (!string.IsNullOrEmpty(search))
odsOrderList.FilterParameters.Add("Status", TypeCode.Int32, search);
BuildFilterBLOCKED EXPRESSION;
break;
default:
break;
}
OnDataBound:
protected void gvOrderList_DataBound(object sender, EventArgs e)
{
BuildFilterBLOCKED EXPRESSION;
}
GetHeader:
protectedstring GetHeader(string HeaderText, string SortExpression)
{
return "<a href=\"javascript:__doPostBack('" + gvOrderList.UniqueID + "','Sort$" + SortExpression + "')\"><font class=\"titel\">" + HeaderText + "</font></a>";
}
BuildFilterExpression:
protected void BuildFilterBLOCKED EXPRESSION
{
if (odsOrderList.FilterParameters.Count > 0)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < odsOrderList.FilterParameters.Count; ++i)
{
switch (odsOrderList.FilterParameters[i].Name)
{
case "Ordernummer":
((TextBox)gvOrderList.HeaderRow.FindControl("tbSearchOrdernummer")).Text = odsOrderList.FilterParameters["Ordernummer"].DefaultValue;
sb.Append("Ordernummer LIKE '{" + i.ToString() + "}%' AND ");
break;
case "DatumVan":
((TextBox)gvOrderList.HeaderRow.FindControl("tbSearchDatumVan")).Text = odsOrderList.FilterParameters["DatumVan"].DefaultValue;
sb.Append("IngangsDatum >= #{" + i.ToString() + "}# AND ");
break;
case "DatumTot":
((TextBox)gvOrderList.HeaderRow.FindControl("tbSearchDatumTot")).Text = odsOrderList.FilterParameters["DatumTot"].DefaultValue;
sb.Append("IngangsDatum <= #{" + i.ToString() + "}# AND ");
break;
case "Achternaam":
((TextBox)gvOrderList.HeaderRow.FindControl("tbSearchAchternaam")).Text = odsOrderList.FilterParameters["Achternaam"].DefaultValue;
sb.Append("Achternaam LIKE '{" + i.ToString() + "}%' AND ");
break;
case "Status":
((DropDownList)gvOrderList.HeaderRow.FindControl("ddlSearchStatus")).SelectedIndex = Convert.ToInt32(odsOrderList.FilterParameters["Status"].DefaultValue);
sb.Append("Status = {" + i.ToString() + "} AND ");
break;
default:
break;
}
}
odsOrderList.FilterExpression = (sb.Remove(sb.Length - 5, 5)).ToString();
}
}
Gridview:
<CustomControls:EmptyGridView ID="gvOrderList" runat="server" DataSourceID="odsOrderList" AllowSorting="true" AllowPaging="true" PageSize="10" PagerSettings-Position="Top" AutoGenerateColumns="false" ShowFooter="true" ShowHeader="true" DataKeyNames="Id" OnDataBound="gvOrderList_DataBound" OnRowCommand="gvOrderList_RowCommand" EmptyDataText="NIEUW - Geen orders" EnableViewState="false">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<asp:Button ID="btnGVSearch" runat="server" CommandName="search" TabIndex="6" Text="Zoek" CssClass="Teksten" />
</HeaderTemplate>
<ItemTemplate>
<asp:ImageButton ID="ibtnEdit" runat="server" CommandName="edit" CommandArgument='<%# Eval("Id") %>' ImageUrl="~/images/edit.gif" /> <asp:ImageButton ID="ibtnDel" runat="server" CommandName="del" CommandArgument='<%# Eval("Id") %>' OnClientClick="return confirm('Weet u zeker dat u deze order wilt verwijderen?')" ImageUrl="~/images/del.gif" />
</ItemTemplate>
<FooterTemplate>
<hr width="100%" />
</FooterTemplate>
<HeaderStyle HorizontalAlign="Left" VerticalAlign="Bottom" />
<ItemStyle Width="75" HorizontalAlign="Left" VerticalAlign="Top" />
</asp:TemplateField>
<asp:TemplateField>
<HeaderTemplate>
<%# GetHeader("Code", "Ordernummer") %>
<br />
<asp:TextBox ID="tbSearchOrdernummer" runat="server" TabIndex="1" />
</HeaderTemplate>
<ItemTemplate>
<%# Eval("Ordernummer") %>
</ItemTemplate>
<HeaderStyle HorizontalAlign="Left" VerticalAlign="Top" />
<ItemStyle HorizontalAlign="Left" VerticalAlign="Top" />
</asp:TemplateField>
...
SOME MORE TEMPLATEFIELDS
...
</Columns>
</CustomControls:EmptyGridView>
<asp:ObjectDataSource ID="odsOrderList" runat="server"
TypeName="ObjectDataSources.odsOrderList"
EnableCaching="true"
CacheKeyDependency="CacheodsOrderList"
SelectMethod="gvOrderList_Select"
SortParameterName="sort"
>
</asp:ObjectDataSource>
Any light you could shed on this would be greatly appreciated.
H. Deur