<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Drawing" %>
<SCRIPT runat="server">
private CheckBox m_checkBox;
private string m_connString = "SERVER=localhost;DATABASE=Northwind;UID=sa;pwd=";
private string m_cmdCustmrs = "SELECT * FROM customers WHERE companyname LIKE '{0}%'";
private string m_cmdInitial = "SELECT DISTINCT substring(companyname, 1, 1) AS Initial FROM customers";
public void Page_Load(object sender, EventArgs e)
...{
if (!IsPostBack)
BindInitials();
}
private void BindInitials()
...{
DataSet _data = new DataSet();
// Get the initials
SqlDataAdapter _adapter = new SqlDataAdapter(m_cmdInitial, m_connString);
_adapter.Fill(_data, "Initials");
Picker.DataSource = _data.Tables["Initials"].DefaultView;
Picker.DataBind();
}
private void BindData()
...{
BindData((string) ViewState["Initial"]);
}
private void BindData(string initial)
...{
// Store the initial
ViewState["Initial"] = initial;
// Get the data
string _cmdText = m_cmdInitial + ";";
_cmdText += String.Format(m_cmdCustmrs, initial);
SqlDataAdapter _adapter = new SqlDataAdapter(_cmdText, m_connString);
DataSet _data = new DataSet();
_adapter.Fill(_data);
// Rename tables
_data.Tables[0].TableName = "Initials";
_data.Tables[1].TableName = "Customers";
// Reset selected and edit items
Customers.SelectedIndex = -1;
Customers.EditItemIndex = -1;
Picker.DataSource = _data.Tables["Initials"].DefaultView;
Picker.DataBind();
Customers.DataSource = _data.Tables["Customers"].DefaultView;
Customers.DataBind();
}
public void SelectedIndexChanged(object sender, EventArgs e)
...{
// Scroll into view
if (Customers.SelectedIndex != -1)
...{
string custID = (string) Customers.DataKeys[Customers.SelectedIndex];
TheBody.Attributes["onload"] = String.Format("ScrollToElem('{0}')", custID);
}
}
public void OnRefresh(object sender, EventArgs e)
...{
BindData();
}
private string SetCustomerName(object dataItem)
...{
string _output = "<b>{0} - {1}</b>";
DataRowView _row = (DataRowView) dataItem;
_output = String.Format(_output, _row["customerid"], _row["companyname"]);
return _output;
}
private string ShowInfoBar(object dataItem)
...{
string color = (m_checkBox.Checked ?"blue" :"black");
string _output = "<span style='color:{0};'>(<i>{1}, {2}</i>)</span>";
DataRowView _row = (DataRowView) dataItem;
_output = String.Format(_output, color, _row["contactname"], _row["contacttitle"]);
return _output;
}
private string ShowAddressBar(object dataItem)
...{
if (!m_checkBox.Checked)
return "";
string color = (m_checkBox.Checked ?"blue" :"black");
string _output = "<br><span style='color:{0};'>{1}, {2} ({3})<br>{4}</span>";
DataRowView _row = (DataRowView) dataItem;
_output = String.Format(_output, color, _row["address"], _row["city"], _row["country"], _row["Phone"]);
return _output;
}
private string SetHeader()
...{
string _text = "Customers [{0}]";
return String.Format(_text, (string) ViewState["Initial"]);
}
private string SetFooter()
...{
string _text = "{0} customer(s) found.";
ICollection _coll = (ICollection) Customers.DataSource;
return String.Format(_text, _coll.Count);
}
private Color GetBackColor(object dataItem)
...{
string _initial = (string) ((DataRowView)dataItem)["Initial"];
if (_initial == (string) ViewState["Initial"])
return Color.Gray;
return Color.LightCyan;
}
private Color GetForeColor(object dataItem)
...{
string _initial = (string) ((DataRowView)dataItem)["Initial"];
if (_initial == (string) ViewState["Initial"])
return Color.White;
return Color.Black;
}
private CheckBox FindCheckBox(Control container)
...{
CheckBox ctl = (CheckBox) container.FindControl("ExpandButton");
if (ctl == null)
return null;
// Must anticipate the state restoration here. When this function executes we're
// in the middle of the DataBind call on the given RepeaterItem object and
// before the ItemDataBound event fires. At this time, the Checked property of the
// CheckBox (as well as the Text property of a TextBox) has not been updated yet.
ctl.Checked = (Page.Request.Form[ctl.UniqueID]=="on");
return ctl;
}
private void ItemCommand(object sender, DataListCommandEventArgs e)
...{
BindData(e.CommandName);
}
</SCRIPT>
<html>
<title>Customers</title>
<style>
a:hover ...{color:red;text-decoration:underline;}
a ...{text-decoration:none;}
</style>
<SCRIPT>
function ScrollToElem(custID)
...{
var elem = document.all(custID);
if (elem == null)
return;
elem.scrollIntoView(true);
}
</SCRIPT>
<body runat="server" id="TheBody" vlink="black" link="black" bgcolor="ivory" style="font-family:arial;font-size:9pt">
<form runat="server">
<asp:datalist runat="server" id="Picker" repeatlayout="flow" repeatdirection="horizontal" OnItemCommand="ItemCommand">
<ItemTemplate>
<asp:button runat="server" style="border:solid 1px gray;width=30px;"
backcolor='<%# GetBackColor(Container.DataItem) %>'
forecolor='<%# GetForeColor(Container.DataItem) %>'
text='<%# DataBinder.Eval(Container.DataItem, "Initial")%>'
commandname='<%# DataBinder.Eval(Container.DataItem, "Initial")%>' />
</ItemTemplate>
</asp:datalist>
<div style="border:solid 1px gray;">
<asp:datalist runat="server" id="Customers"
RepeatLayout="flow"
DataKeyField="customerid"
OnSelectedIndexChanged="SelectedIndexChanged">
<SelectedItemStyle backcolor="cyan" width="100%" />
<HeaderTemplate>
<div style="background-color:gray;color:white;height:20px;"> <big><b><%# SetHeader() %></b></big></div>
<div style="background-color:white;height:260px;overflow:auto;">
</HeaderTemplate>
<ItemTemplate>
<span id='<%# DataBinder.Eval(Container.DataItem, "customerid") %>'>
<span style="display:none;">
<%# m_checkBox = (CheckBox) FindCheckBox(Container) %>
</span>
<asp:checkbox runat="server" id="ExpandButton" />
<asp:linkbutton runat="server" commandname="select"
text='<%# SetCustomerName(Container.DataItem) %>' />
<br>
<%# ShowInfoBar(Container.DataItem) %>
<%# ShowAddressBar(Container.DataItem) %>
</span>
</ItemTemplate>
<SeparatorTemplate>
</SeparatorTemplate>
<FooterTemplate>
</div>
<div style="background-color:gray;color:white;height:20px;"> <b><%# SetFooter() %></b></div>
</FooterTemplate>
</asp:datalist>
</div>
<br>
<asp:button runat="server" text="Refresh" onclick="OnRefresh" font-bold="true" style="border:solid 1px gray;width=80px;" />
</form>
</body>
</html>