You've already forked linux-packaging-mono
Imported Upstream version 4.6.0.125
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
This commit is contained in:
parent
a569aebcfd
commit
e79aa3c0ed
219
mcs/class/referencesource/System.Web/UI/WebControls/DataKey.cs
Normal file
219
mcs/class/referencesource/System.Web/UI/WebControls/DataKey.cs
Normal file
@ -0,0 +1,219 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <copyright file="DataKey.cs" company="Microsoft">
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// </copyright>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace System.Web.UI.WebControls {
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Specialized;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
|
||||
/// <devdoc>
|
||||
/// </devdoc>
|
||||
public class DataKey : IStateManager, IEquatable<DataKey> {
|
||||
|
||||
private IOrderedDictionary _keyTable;
|
||||
private bool _isTracking;
|
||||
private string[] _keyNames;
|
||||
|
||||
|
||||
public DataKey(IOrderedDictionary keyTable) {
|
||||
_keyTable = keyTable;
|
||||
}
|
||||
|
||||
public DataKey(IOrderedDictionary keyTable, string[] keyNames)
|
||||
: this(keyTable) {
|
||||
_keyNames = keyNames;
|
||||
}
|
||||
|
||||
|
||||
/// <devdoc>
|
||||
/// Inheritable overridable implementation of IsTrackingViewState
|
||||
/// </devdoc>
|
||||
protected virtual bool IsTrackingViewState {
|
||||
get {
|
||||
return _isTracking;
|
||||
}
|
||||
}
|
||||
|
||||
public virtual object this[int index] {
|
||||
get {
|
||||
if (_keyTable != null) {
|
||||
return _keyTable[index];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public virtual object this[string name] {
|
||||
get {
|
||||
if (_keyTable != null) {
|
||||
return _keyTable[name];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public virtual object Value {
|
||||
get {
|
||||
if ((_keyTable != null) && (_keyTable.Count > 0)) {
|
||||
return _keyTable[0];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public virtual IOrderedDictionary Values {
|
||||
get {
|
||||
if (_keyTable == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (_keyTable is OrderedDictionary) {
|
||||
return ((OrderedDictionary)_keyTable).AsReadOnly();
|
||||
}
|
||||
|
||||
// don't return the actual table because we don't want the user to mess with it.
|
||||
if (_keyTable is ICloneable) {
|
||||
return (IOrderedDictionary)((ICloneable)_keyTable).Clone();
|
||||
}
|
||||
OrderedDictionary table = new OrderedDictionary();
|
||||
|
||||
foreach (DictionaryEntry entry in _keyTable) {
|
||||
table.Add(entry.Key, entry.Value);
|
||||
}
|
||||
return table.AsReadOnly();
|
||||
}
|
||||
}
|
||||
|
||||
/// <devdoc>
|
||||
/// Inheritable overridable implementation of LoadViewState
|
||||
/// </devdoc>
|
||||
protected virtual void LoadViewState(object state) {
|
||||
if (state != null) {
|
||||
if (_keyNames != null) {
|
||||
object[] myState = (object[])state;
|
||||
// if we have key names, then we only stored values.
|
||||
if (myState[0] != null) {
|
||||
for (int i = 0; i < myState.Length && i < _keyNames.Length; i++) {
|
||||
_keyTable.Add(_keyNames[i], myState[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (state != null) {
|
||||
ArrayList stateArrayList = state as ArrayList;
|
||||
if (stateArrayList == null) {
|
||||
throw new HttpException(SR.GetString(SR.ViewState_InvalidViewState));
|
||||
}
|
||||
OrderedDictionaryStateHelper.LoadViewState(_keyTable, stateArrayList);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <devdoc>
|
||||
/// Inheritable overridable implementation of SaveViewState
|
||||
/// </devdoc>
|
||||
protected virtual object SaveViewState() {
|
||||
int count = _keyTable.Count;
|
||||
if (count > 0) {
|
||||
object myState;
|
||||
if (_keyNames != null) {
|
||||
// if we have key names, then we only have to store values.
|
||||
myState = new object[count];
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
((object[])myState)[i] = _keyTable[i];
|
||||
}
|
||||
}
|
||||
else {
|
||||
myState = OrderedDictionaryStateHelper.SaveViewState(_keyTable);
|
||||
}
|
||||
|
||||
return myState;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/// <devdoc>
|
||||
/// Inheritable overridable implementation of TrackViewState
|
||||
/// </devdoc>
|
||||
protected virtual void TrackViewState() {
|
||||
_isTracking = true;
|
||||
}
|
||||
|
||||
#region IStateManager implementation
|
||||
|
||||
/// <internalonly/>
|
||||
bool IStateManager.IsTrackingViewState {
|
||||
get {
|
||||
return IsTrackingViewState;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <internalonly/>
|
||||
void IStateManager.LoadViewState(object state) {
|
||||
LoadViewState(state);
|
||||
}
|
||||
|
||||
|
||||
/// <internalonly/>
|
||||
object IStateManager.SaveViewState() {
|
||||
return SaveViewState();
|
||||
}
|
||||
|
||||
|
||||
/// <internalonly/>
|
||||
void IStateManager.TrackViewState() {
|
||||
TrackViewState();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region IEquatable<DataKey> Members
|
||||
|
||||
[SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]
|
||||
public bool Equals(DataKey other) {
|
||||
if (other == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
string[] aKeys = _keyNames;
|
||||
string[] bKeys = other._keyNames;
|
||||
|
||||
if (aKeys == null && _keyTable != null) {
|
||||
aKeys = new string[_keyTable.Count];
|
||||
_keyTable.Keys.CopyTo(aKeys, 0);
|
||||
}
|
||||
|
||||
if (bKeys == null && _keyTable != null) {
|
||||
bKeys = new string[other._keyTable.Count];
|
||||
other._keyTable.Keys.CopyTo(bKeys, 0);
|
||||
}
|
||||
|
||||
// Compare the keys array
|
||||
bool hasSameKeyNames = DataBoundControlHelper.CompareStringArrays(aKeys, bKeys);
|
||||
if (hasSameKeyNames) {
|
||||
if (aKeys != null && bKeys != null) {
|
||||
foreach (string key in aKeys) {
|
||||
if (!Object.Equals(this[key], other[key])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user