e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
220 lines
6.6 KiB
C#
220 lines
6.6 KiB
C#
//------------------------------------------------------------------------------
|
|
// <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
|
|
}
|
|
}
|