HtmlSelectElement
sealed class HtmlSelectElement : HtmlFormControlElementWithState, IHtmlSelectElement, IHtmlElement, IElement, INode, IEventTarget, IMarkupFormattable, IParentNode, IChildNode, INonDocumentTypeChildNode, IElementCssInlineStyle, IGlobalEventHandlers, IValidation
Represents the select element.
using AngleSharp.Dom.Collections;
using AngleSharp.Dom.Css;
using AngleSharp.Dom.Events;
using AngleSharp.Extensions;
using AngleSharp.Html;
using System.Linq;
namespace AngleSharp.Dom.Html
{
internal sealed class HtmlSelectElement : HtmlFormControlElementWithState, IHtmlSelectElement, IHtmlElement, IElement, INode, IEventTarget, IMarkupFormattable, IParentNode, IChildNode, INonDocumentTypeChildNode, IElementCssInlineStyle, IGlobalEventHandlers, IValidation
{
private OptionsCollection _options;
private HtmlCollection<IHtmlOptionElement> _selected;
public IHtmlOptionElement this[int index] {
get {
return Options.GetOptionAt(index);
}
set {
Options.SetOptionAt(index, value);
}
}
public int Size {
get {
return this.GetOwnAttribute(AttributeNames.Size).ToInteger(0);
}
set {
this.SetOwnAttribute(AttributeNames.Size, value.ToString(), false);
}
}
public bool IsRequired {
get {
return this.HasOwnAttribute(AttributeNames.Required);
}
set {
this.SetOwnAttribute(AttributeNames.Required, value ? string.Empty : null, false);
}
}
public IHtmlCollection<IHtmlOptionElement> SelectedOptions => _selected ?? (_selected = new HtmlCollection<IHtmlOptionElement>(from m in Options
where m.IsSelected
select m));
public int SelectedIndex => Options.SelectedIndex;
public string Value {
get {
foreach (IHtmlOptionElement option in Options) {
if (option.IsSelected)
return option.Value;
}
return null;
}
set {
UpdateValue(value);
}
}
public int Length => Options.Length;
public bool IsMultiple {
get {
return this.HasOwnAttribute(AttributeNames.Multiple);
}
set {
this.SetOwnAttribute(AttributeNames.Multiple, value ? string.Empty : null, false);
}
}
public IHtmlOptionsCollection Options => _options ?? (_options = new OptionsCollection(this));
public string Type {
get {
if (!IsMultiple)
return InputTypeNames.SelectOne;
return InputTypeNames.SelectMultiple;
}
}
static HtmlSelectElement()
{
Element.RegisterCallback(AttributeNames.Value, delegate(HtmlSelectElement element, string value) {
element.UpdateValue(value);
});
}
public HtmlSelectElement(Document owner, string prefix = null)
: base(owner, TagNames.Select, prefix, NodeFlags.None)
{
}
public void AddOption(IHtmlOptionElement element, IHtmlElement before = null)
{
Options.Add(element, before);
}
public void AddOption(IHtmlOptionsGroupElement element, IHtmlElement before = null)
{
Options.Add(element, before);
}
public void RemoveOptionAt(int index)
{
Options.Remove(index);
}
internal override FormControlState SaveControlState()
{
return new FormControlState(base.Name, Type, Value);
}
internal override void RestoreFormControlState(FormControlState state)
{
if (state.Type.Is(Type) && state.Name.Is(base.Name))
Value = state.Value;
}
internal override void ConstructDataSet(FormDataSet dataSet, IHtmlElement submitter)
{
IHtmlOptionsCollection options = Options;
for (int i = 0; i < options.Length; i++) {
IHtmlOptionElement optionAt = options.GetOptionAt(i);
if (optionAt.IsSelected && !optionAt.IsDisabled)
dataSet.Append(base.Name, optionAt.Value, Type);
}
}
internal override void SetupElement()
{
base.SetupElement();
string ownAttribute = this.GetOwnAttribute(AttributeNames.Value);
if (ownAttribute != null)
UpdateValue(ownAttribute);
}
internal override void Reset()
{
IHtmlOptionsCollection options = Options;
int num = 0;
int index = 0;
for (int i = 0; i < options.Length; i++) {
IHtmlOptionElement optionAt = options.GetOptionAt(i);
optionAt.IsSelected = optionAt.IsDefaultSelected;
if (optionAt.IsSelected) {
index = i;
num++;
}
}
if (num != 1 && !IsMultiple && options.Length > 0) {
foreach (IHtmlOptionElement item in options) {
item.IsSelected = false;
}
options[index].IsSelected = true;
}
}
private void UpdateValue(string value)
{
foreach (IHtmlOptionElement option in Options) {
bool flag2 = option.IsSelected = option.Value.Isi(value);
}
}
protected override bool CanBeValidated()
{
return !this.HasDataListAncestor();
}
protected override void Check(ValidityState state)
{
string value = Value;
state.IsValueMissing = (IsRequired && string.IsNullOrEmpty(value));
}
}
}