📄 autosuggestbox.cs
字号:
}
public string MenuItemCSSClass
{
get { return ViewState["MenuItemCSSClass"] == null ? "asbMenuItem" : ViewState["MenuItemCSSClass"].ToString(); }
set { ViewState["MenuItemCSSClass"] = value; }
}
public string SelectedMenuItemCSSClass
{
get { return ViewState["SelectedMenuItemCSSClass"] == null ? "asbSelMenuItem" : ViewState["SelectedMenuItemCSSClass"].ToString(); }
set { ViewState["SelectedMenuItemCSSClass"] = value; }
}
public bool UseIFrame
{
get { return ViewState["UseIFrame"] == null ? true : Convert.ToBoolean(ViewState["UseIFrame"]); }
set { ViewState["UseIFrame"] = value; }
}
public string CallBackControlID
{
get { return ViewState["CallBackControlID"] == null ? this.ClientID : ViewState["CallBackControlID"].ToString(); }
set { ViewState["CallBackControlID"] = value; }
}
public string TextBoxID
{
get {
this.EnsureChildControls();
return this._textBox.ClientID;
}
}
private string MenuDivID
{
get {return "divMenu_" + this.TextBoxID;}
}
/// <summary>
/// Indicates if the field is required
/// </summary>
[Description("Indicates if the field is required")]
public bool Required
{
get { return ViewState["Required"] == null ? false : Convert.ToBoolean(ViewState["Required"]); }
set { ViewState["Required"] = value; }
}
/// <summary>
/// RequiredFieldValidator error message
/// </summary>
[Description("RequiredFieldValidator error message")]
public string ErrorMessage
{
get { return ViewState["ErrorMessage"] == null ? "This field is required" : ViewState["ErrorMessage"].ToString(); }
set { ViewState["ErrorMessage"] = value; }
}
/// <summary>
/// RequiredFieldValidator validation group
/// </summary>
[Description("RequiredFieldValidator validation group")]
public string ValidationGroup
{
get { return ViewState["ValidationGroup"] == null ? "" : ViewState["ValidationGroup"].ToString(); }
set { ViewState["ValidationGroup"] = value; }
}
public string TableHeaderCssClass
{
get { return ViewState["TableHeaderCssClass"] == null ? "" : ViewState["TableHeaderCssClass"].ToString(); }
set { ViewState["TableHeaderCssClass"] = value; }
}
public string TableCssClass
{
get { return ViewState["TableCssClass"] == null ? "" : ViewState["TableCssClass"].ToString(); }
set { ViewState["TableCssClass"] = value; }
}
public string DataKeyField
{
get { return ViewState["DataKeyField"] == null ? "" : ViewState["DataKeyField"].ToString(); }
set { ViewState["DataKeyField"] = value; }
}
/// <summary>
/// The field that will be displayed on the textbox after an item is selected
/// </summary>
[Description("The field that will be displayed on the textbox after an item is selected")]
public string TextBoxDisplayField
{
get { return ViewState["TextBoxDisplayField"] == null ? "" : ViewState["TextBoxDisplayField"].ToString(); }
set { ViewState["TextBoxDisplayField"] = value; }
}
public Unit Width
{
get { return ViewState["Width"] == null ? new Unit("200px") : (Unit)ViewState["Width"]; }
set { ViewState["Width"] = value; }
}
#endregion
#region GetFirst
private Control GetFirstCtrl(string sCtrlType, ControlCollection colControls)
{
Control oFirstCtrl = null;
foreach (Control oCtrl in colControls)
{
//Check if control type matches sCtrlType
if (oCtrl.GetType().ToString() == sCtrlType)
{
//Make sure the control is visible
if (oCtrl.Visible)
return oCtrl;
else
continue;
}
if (oCtrl.HasControls())
{
oFirstCtrl = GetFirstCtrl(sCtrlType, oCtrl.Controls);
if (oFirstCtrl != null)
break;
}
}
return oFirstCtrl;
}
private bool IsTopASBCtrl()
{
Control oCtrl = GetFirstCtrl("ASB.AutoSuggestBox", Page.Controls);
if (oCtrl == null)
return false;
if (oCtrl.ClientID == this.ClientID)
return true;
else
return false;
}
#endregion
/// <summary>
/// Writes the initialization javascript code for the control
/// </summary>
/// <param name="output">Page output</param>
protected void WriteJSAutoSuggestBox(HtmlTextWriter output)
{
//Check if this is the first visible ASP control on the page
if (this.IsTopASBCtrl())
{
//Declare auto suggest box object
output.WriteLine("<script language=\"javascript\">");
output.WriteLine("<!--");
output.WriteLine("var oJSAutoSuggestBox;");
output.WriteLine("//-->");
output.WriteLine("</script>");
output.WriteLine("");
}
output.WriteLine("<script language=\"javascript\">");
output.WriteLine("<!--");
output.Write(GetInitializationScript());
output.WriteLine("//-->");
output.WriteLine("</script>");
output.WriteLine("");
//Validation Script
if (this.Required)
{
string str = @"<script type=""text/javascript"">
//![CDATA[
function " + this.ClientID + @"ClientValidate(sender, args)
{
args.IsValid = !(args.Value == '' || args.Value == '0');
return;
}
//]]>
</script>";
output.Write(str);
}
}
/// <summary>
/// Returns the javascript code necessary to instanciate the object that represents the control
/// </summary>
private string GetInitializationScript()
{
StringBuilder str = new StringBuilder();
str.Append("oJSAutoSuggestBox=new JSAutoSuggestBox();");
str.Append("oJSAutoSuggestBox.msTextBoxID='" + this.TextBoxID + "';");
str.Append("oJSAutoSuggestBox.msMenuDivID='" + this.MenuDivID + "';");
str.Append("oJSAutoSuggestBox.mnMaxSuggestChars=" + this.MaxSuggestChars.ToString() + ";");
str.Append("oJSAutoSuggestBox.mnKeyPressDelay=" + this.KeyPressDelay.ToString() + ";");
str.Append("oJSAutoSuggestBox.msMenuCSSClass='" + this.MenuCSSClass + "';");
str.Append("oJSAutoSuggestBox.msMenuItemCSSClass='" + this.MenuItemCSSClass + "';");
str.Append("oJSAutoSuggestBox.msSelMenuItemCSSClass='" + this.SelectedMenuItemCSSClass + "';");
str.Append("oJSAutoSuggestBox.mbUseIFrame=" + this.UseIFrame.ToString().ToLower() + ";");
str.Append("oJSAutoSuggestBox.ControlID='" + this.CallBackControlID + "';");
str.Append("oJSAutoSuggestBox.HiddenTextBoxID='" + this._hiddenTextBox.ClientID + "';");
str.Append("oJSAutoSuggestBox.AutoCallBack=" + this.AutoCallBack.ToString().ToLower() + ";");
str.Append("oJSAutoSuggestBox.mnSelMenuItem=0;");
str.Append("oJSAutoSuggestBox.BlankPageURL='" + Page.ClientScript.GetWebResourceUrl(this.GetType(),
"Anthem.includes.Blank.html") + "';");
str.Append("asbAddObj('" + this.TextBoxID + "', oJSAutoSuggestBox);");
return str.ToString();
}
/// <summary>Renders AutoSuggestBox to the output HTML parameter specified.</summary>
/// <param name="output"> The HTML writer to write out to</param>
protected override void Render(HtmlTextWriter output)
{
if(!DesignMode)
RegisterClientScript();
if (!Manager.IsCallBack)
WriteJSAutoSuggestBox(output);
else
Manager.AddScriptForClientSideEval(GetInitializationScript());
string sObj="asbGetObj('" + this.TextBoxID + "')";
//Set the javascript event handlers
this._textBox.Attributes["onblur"] = sObj + ".OnBlur();";
this._textBox.Attributes["onkeydown"] = sObj + ".OnKeyDown(event);";
this._textBox.Attributes["onkeypress"] = "return " + sObj + ".OnKeyPress(event);";
this._textBox.Attributes["onkeyup"] = sObj + ".OnKeyUp(event);";
this._textBox.Attributes["autocomplete"] = "off";
AnthemDefaultRenderCode(output);
}
private void AnthemDefaultRenderCode(HtmlTextWriter output)
{
if (!DesignMode)
{
// parentTagName must be defined as a private const string field in this class.
Anthem.Manager.WriteBeginControlMarker(output, "span", this);
}
if (Visible)
{
base.Render(output);
output.WriteLine("<br><div class='" + this.MenuCSSClass + "' style='visibility:hidden;' id='" + this.MenuDivID + "'></div>");
}
if (!DesignMode)
{
Anthem.Manager.WriteEndControlMarker(output, "span", this);
}
}
#region GetSuggestions
public delegate void TextChangedEventHandler(object source, AutoSuggestEventArgs e);
public event TextChangedEventHandler TextChanged;
public delegate void SelectedValueChangedHandler(object source, EventArgs e);
public event SelectedValueChangedHandler SelectedValueChanged;
public delegate void ItemDataBoundHandler(object source, AutoSuggestItemEventArgs e);
public event ItemDataBoundHandler ItemDataBound;
[Anthem.Method]
public void GetSuggestions(string text)
{
if (TextChanged != null)
TextChanged(this, new AutoSuggestEventArgs(text));
}
/// <summary>
/// This method is supposed to be called everytime the suggested list changes,
/// usually when the SelectedValueChanged event is fired
/// </summary>
public override void DataBind()
{
if (DataSource == null) return;
HtmlTextWriter writer = new HtmlTextWriter(new StringWriter());
int i = 0;
//Header template
if (HeaderTemplate != null)
{
AutoSuggestItem item = new AutoSuggestItem(-1, "", AutoSuggestItemType.Header);
HeaderTemplate.InstantiateIn(item);
//Fires the ItemDataBound event
if (ItemDataBound != null)
ItemDataBound(this, new AutoSuggestItemEventArgs(item));
if (item.Controls.Count > 0)
{
foreach (Control control in item.Controls)
{
control.RenderControl(writer);
}
}
}
//ItemTemplate
IEnumerator dataEnum = DataSource.GetEnumerator();
while (dataEnum.MoveNext())
{
// Find out if its an alternating item
AutoSuggestItemType itemType = (i + 1)%2 == 0 ? AutoSuggestItemType.AlternatingItem : AutoSuggestItemType.Item;
//Creates the item
AutoSuggestItem item = new AutoSuggestItem(i, dataEnum.Current, itemType);
if (this.ItemTemplate != null)
this.ItemTemplate.InstantiateIn(item);
HtmlTextWriter w = new HtmlTextWriter(new StringWriter());
AutoSuggestMenuItem asbItem = new AutoSuggestMenuItem();
asbItem.CSSClass = this.MenuItemCSSClass;
item.DataBind();
//Fires the ItemDataBound event before rendering the item
if (ItemDataBound != null)
ItemDataBound(this, new AutoSuggestItemEventArgs(item));
item.RenderControl(w);
asbItem.Text = w.InnerWriter.ToString();
if (DataKeyField != "")
asbItem.Value = GetField(item, this.DataKeyField);
asbItem.TextBoxText = GetField(item, this.TextBoxDisplayField);
writer.WriteLine(asbItem.GenHtml(i + 1, this.TextBoxID));
this.Controls.Add(item);
i++;
}
string html = "";
if (i > 0)
{
html = string.Format("<table style=\"width:{0}\"><tr><td>{1}</td></tr></table>",
this.Width.ToString(),
writer.InnerWriter.ToString());
}
else
{
html =
string.Format(
"<table style=\"width:{0}\"><tr><td align=\"center\" style=\"color:red;\"><b>{1}</b></td></tr></table>",
this.Width.ToString(),
this.ItemNotFoundMessage);
}
StringBuilder sb = new StringBuilder();
Manager.WriteValue(sb, html);
string script = string.Format("asbGetObj('{0}').ShowMenuDiv({1});", this.TextBoxID, sb.ToString());
Manager.AddScriptForClientSideEval(script);
}
private string GetField(AutoSuggestItem item, string field)
{
if (item.DataItem is DataRowView)
return ((DataRowView)item.DataItem)[field].ToString();
else if (item.DataItem is DataRow)
return ((DataRow)item.DataItem)[field].ToString();
else if (item.DataItem is ICollection)
{
Type type = item.DataItem.GetType();
MethodInfo m = type.GetMethod("get_Item");
return m.Invoke(item.DataItem, new object[] { field }).ToString();
}
else
{
//Here we use reflection to get the value of the any field of the defined
//in the DataItem property of AutoSuggestItem
Type type = item.DataItem.GetType();
FieldInfo fieldInfo = type.GetField(field);
if (fieldInfo != null)
return fieldInfo.GetValue(item.DataItem).ToString();
else
{
PropertyInfo prop = type.GetProperty(field);
if (prop != null)
return prop.GetValue(item.DataItem, null).ToString();
}
}
throw new Exception("The datasource type is not supported");
}
[Anthem.Method]
public void FireSelectedValueChangedEvent(string newValue)
{
this.SelectedValue = newValue;
if (SelectedValueChanged != null)
SelectedValueChanged(this, new EventArgs());
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -