236 lines
7.4 KiB
C#
236 lines
7.4 KiB
C#
|
//------------------------------------------------------------------------------
|
||
|
// <copyright file="BoundColumn.cs" company="Microsoft">
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
// </copyright>
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
namespace System.Web.UI.WebControls {
|
||
|
|
||
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.ComponentModel;
|
||
|
using System.Globalization;
|
||
|
using System.Web;
|
||
|
using System.Web.UI;
|
||
|
using System.Web.Util;
|
||
|
|
||
|
/// <devdoc>
|
||
|
/// <para>Creates a column bounded to a data field in a <see cref='System.Web.UI.WebControls.DataGrid'/>.</para>
|
||
|
/// </devdoc>
|
||
|
public class BoundColumn : DataGridColumn {
|
||
|
|
||
|
|
||
|
/// <devdoc>
|
||
|
/// <para>Specifies a string that represents "this". This field is read-only. </para>
|
||
|
/// </devdoc>
|
||
|
public static readonly string thisExpr = "!";
|
||
|
|
||
|
private PropertyDescriptor boundFieldDesc;
|
||
|
private bool boundFieldDescValid;
|
||
|
private string boundField;
|
||
|
private string formatting;
|
||
|
|
||
|
|
||
|
/// <devdoc>
|
||
|
/// <para>Initializes a new instance of a <see cref='System.Web.UI.WebControls.BoundColumn'/> class.</para>
|
||
|
/// </devdoc>
|
||
|
public BoundColumn() {
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/// <devdoc>
|
||
|
/// <para> Gets or sets the field name from the data model bound to this column.</para>
|
||
|
/// </devdoc>
|
||
|
[
|
||
|
WebCategory("Data"),
|
||
|
DefaultValue(""),
|
||
|
WebSysDescription(SR.BoundColumn_DataField)
|
||
|
]
|
||
|
public virtual string DataField {
|
||
|
get {
|
||
|
object o = ViewState["DataField"];
|
||
|
if (o != null)
|
||
|
return (string)o;
|
||
|
return String.Empty;
|
||
|
}
|
||
|
set {
|
||
|
ViewState["DataField"] = value;
|
||
|
OnColumnChanged();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/// <devdoc>
|
||
|
/// <para>Gets or sets the display format of data in this
|
||
|
/// column.</para>
|
||
|
/// </devdoc>
|
||
|
[
|
||
|
WebCategory("Behavior"),
|
||
|
DefaultValue(""),
|
||
|
WebSysDescription(SR.BoundColumn_DataFormatString)
|
||
|
]
|
||
|
public virtual string DataFormatString {
|
||
|
get {
|
||
|
object o = ViewState["DataFormatString"];
|
||
|
if (o != null)
|
||
|
return (string)o;
|
||
|
return String.Empty;
|
||
|
}
|
||
|
set {
|
||
|
ViewState["DataFormatString"] = value;
|
||
|
OnColumnChanged();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/// <devdoc>
|
||
|
/// <para>Gets or sets the property that prevents modification to data
|
||
|
/// in this column.</para>
|
||
|
/// </devdoc>
|
||
|
[
|
||
|
WebCategory("Behavior"),
|
||
|
DefaultValue(false),
|
||
|
WebSysDescription(SR.BoundColumn_ReadOnly)
|
||
|
]
|
||
|
public virtual bool ReadOnly {
|
||
|
get {
|
||
|
object o = ViewState["ReadOnly"];
|
||
|
if (o != null)
|
||
|
return (bool)o;
|
||
|
return false;
|
||
|
}
|
||
|
set {
|
||
|
ViewState["ReadOnly"] = value;
|
||
|
OnColumnChanged();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/// <devdoc>
|
||
|
/// </devdoc>
|
||
|
protected virtual string FormatDataValue(object dataValue) {
|
||
|
string formattedValue = String.Empty;
|
||
|
|
||
|
if (!DataBinder.IsNull(dataValue)) {
|
||
|
if (formatting.Length == 0) {
|
||
|
formattedValue = dataValue.ToString();
|
||
|
}
|
||
|
else {
|
||
|
formattedValue = String.Format(CultureInfo.CurrentCulture, formatting, dataValue);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return formattedValue;
|
||
|
}
|
||
|
|
||
|
|
||
|
/// <devdoc>
|
||
|
/// </devdoc>
|
||
|
public override void Initialize() {
|
||
|
base.Initialize();
|
||
|
|
||
|
boundFieldDesc = null;
|
||
|
boundFieldDescValid = false;
|
||
|
|
||
|
boundField = DataField;
|
||
|
formatting = DataFormatString;
|
||
|
}
|
||
|
|
||
|
|
||
|
/// <devdoc>
|
||
|
/// <para>Initializes a cell in the DataGridColumn.</para>
|
||
|
/// </devdoc>
|
||
|
public override void InitializeCell(TableCell cell, int columnIndex, ListItemType itemType) {
|
||
|
base.InitializeCell(cell, columnIndex, itemType);
|
||
|
|
||
|
Control childControl = null;
|
||
|
Control boundControl = null;
|
||
|
|
||
|
switch (itemType) {
|
||
|
case ListItemType.Header:
|
||
|
case ListItemType.Footer:
|
||
|
break;
|
||
|
|
||
|
case ListItemType.Item:
|
||
|
case ListItemType.AlternatingItem:
|
||
|
case ListItemType.SelectedItem:
|
||
|
if (DataField.Length != 0) {
|
||
|
boundControl = cell;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case ListItemType.EditItem:
|
||
|
if (ReadOnly == true) {
|
||
|
goto case ListItemType.Item;
|
||
|
}
|
||
|
else {
|
||
|
//
|
||
|
TextBox editor = new TextBox();
|
||
|
childControl = editor;
|
||
|
|
||
|
if (boundField.Length != 0) {
|
||
|
boundControl = editor;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (childControl != null) {
|
||
|
cell.Controls.Add(childControl);
|
||
|
}
|
||
|
|
||
|
if (boundControl != null) {
|
||
|
boundControl.DataBinding += new EventHandler(this.OnDataBindColumn);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/// <devdoc>
|
||
|
/// </devdoc>
|
||
|
private void OnDataBindColumn(object sender, EventArgs e) {
|
||
|
Debug.Assert(DataField.Length != 0, "Shouldn't be DataBinding without a DataField");
|
||
|
|
||
|
Control boundControl = (Control)sender;
|
||
|
DataGridItem item = (DataGridItem)boundControl.NamingContainer;
|
||
|
object dataItem = item.DataItem;
|
||
|
|
||
|
if (boundFieldDescValid == false) {
|
||
|
if (!boundField.Equals(thisExpr)) {
|
||
|
boundFieldDesc = TypeDescriptor.GetProperties(dataItem).Find(boundField, true);
|
||
|
if ((boundFieldDesc == null) && !DesignMode) {
|
||
|
throw new HttpException(SR.GetString(SR.Field_Not_Found, boundField));
|
||
|
}
|
||
|
}
|
||
|
boundFieldDescValid = true;
|
||
|
}
|
||
|
|
||
|
object data = dataItem;
|
||
|
string dataValue;
|
||
|
|
||
|
if ((boundFieldDesc == null) && DesignMode) {
|
||
|
dataValue = SR.GetString(SR.Sample_Databound_Text);
|
||
|
}
|
||
|
else {
|
||
|
if (boundFieldDesc != null) {
|
||
|
data = boundFieldDesc.GetValue(dataItem);
|
||
|
}
|
||
|
dataValue = FormatDataValue(data);
|
||
|
}
|
||
|
|
||
|
if (boundControl is TableCell) {
|
||
|
if (dataValue.Length == 0) {
|
||
|
dataValue = " ";
|
||
|
}
|
||
|
((TableCell)boundControl).Text = dataValue;
|
||
|
}
|
||
|
else {
|
||
|
Debug.Assert(boundControl is TextBox, "Expected the bound control to be a TextBox");
|
||
|
((TextBox)boundControl).Text = dataValue;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|