Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Designer / WinForms / System / WinForms / Design / DataGridViewDesigner.cs / 2 / DataGridViewDesigner.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Windows.Forms.Design {
using System.Design;
using System.ComponentModel;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System;
using System.Collections;
using System.Windows.Forms;
using System.Data;
using System.ComponentModel.Design;
using System.Drawing;
using Microsoft.Win32;
using System.Windows.Forms.ComponentModel;
///
///
/// Provides a base designer for data grids.
///
internal class DataGridViewDesigner : System.Windows.Forms.Design.ControlDesigner {
///
///
/// Gets the design-time verbs suppoted by the component associated with the
/// designer.
///
protected DesignerVerbCollection designerVerbs;
// CHROME stuff
//
// DesignerActionLists
DesignerActionListCollection actionLists = null;
// need this to trap meta data changes
CurrencyManager cm = null;
// cache this type cause we will use it a lot
private static Type typeofIList = typeof(IList);
private static Type typeofDataGridViewImageColumn = typeof(DataGridViewImageColumn);
private static Type typeofDataGridViewTextBoxColumn = typeof(DataGridViewTextBoxColumn);
private static Type typeofDataGridViewCheckBoxColumn = typeof(DataGridViewCheckBoxColumn);
///
///
/// Initializes a new instance of the class.
///
public DataGridViewDesigner() {
AutoResizeHandles = true;
}
// need AssociatedComponents for Copy / Paste
public override ICollection AssociatedComponents {
get {
DataGridView dataGridView = this.Component as DataGridView;
if (dataGridView != null) {
return dataGridView.Columns;
}
return base.AssociatedComponents;
}
}
public DataGridViewAutoSizeColumnsMode AutoSizeColumnsMode
{
get
{
DataGridView dataGridView = this.Component as DataGridView;
Debug.Assert(dataGridView != null, "Unexpected null dataGridView in DataGridViewDesigner:get_AutoSizeColumnsMode");
return dataGridView.AutoSizeColumnsMode;
}
set
{
// [....]: this is a workaround for a bug in ComponentCache: if a component changed then its list of AssociatedComponents
// is not marked as changed to the serialization engine will not serialize them.
DataGridView dataGridView = this.Component as DataGridView;
Debug.Assert(dataGridView != null, "Unexpected null dataGridView in DataGridViewDesigner:set_AutoSizeColumnsMode");
IComponentChangeService ccs = this.Component.Site.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
PropertyDescriptor prop = TypeDescriptor.GetProperties(typeof(DataGridViewColumn))["Width"];
for (int i = 0; i < dataGridView.Columns.Count; i++)
{
ccs.OnComponentChanging(dataGridView.Columns[i], prop);
}
dataGridView.AutoSizeColumnsMode = value;
for (int i = 0; i < dataGridView.Columns.Count; i++)
{
ccs.OnComponentChanged(dataGridView.Columns[i], prop, null, null);
}
}
}
public object DataSource
{
get
{
return ((DataGridView) this.Component).DataSource;
}
set
{
DataGridView dgv = this.Component as DataGridView;
if (dgv.AutoGenerateColumns && dgv.DataSource == null && value != null)
{
//
// RefreshColumnCollection() method does the job of siting/unsiting DataGridViewColumns
// and calls OnComponentChanged/ing at the right times.
// So we need to create / remove columns from the DataGridView DataSource via RefreshColumnCollection() method.
// Set AutoGenerateColumn to false before setting the DataSource, otherwise DataGridViewColumns will be created
// via the runtime method.
//
// We set AutoGenerateColumns to FALSE only if the DataGridView will get a not-null DataSource.
//
dgv.AutoGenerateColumns = false;
}
((DataGridView) this.Component).DataSource = value;
}
}
protected override void Dispose(bool disposing)
{
if (disposing) {
// we still need the current Component
// so execute this code before base.Dispose(...)
Debug.Assert(this.Component != null, "how did this get set to null?");
DataGridView dataGridView = this.Component as DataGridView;
// unhook our event handlers
dataGridView.DataSourceChanged -= new EventHandler(dataGridViewChanged);
dataGridView.DataMemberChanged -= new EventHandler(dataGridViewChanged);
dataGridView.BindingContextChanged -= new EventHandler(dataGridViewChanged);
dataGridView.ColumnRemoved -= new DataGridViewColumnEventHandler(dataGridView_ColumnRemoved);
// unhook MetaDataChanged handler from the currency manager
if (this.cm != null) {
cm.MetaDataChanged -= new EventHandler(this.dataGridViewMetaDataChanged);
}
this.cm = null;
// unhook the ComponentRemoved event handler
if (this.Component.Site != null)
{
IComponentChangeService ccs = this.Component.Site.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (ccs != null)
{
ccs.ComponentRemoving -= new ComponentEventHandler(DataGridViewDesigner_ComponentRemoving);
}
}
}
base.Dispose(disposing);
}
public override void Initialize(IComponent component) {
base.Initialize(component);
if (component.Site != null)
{
IComponentChangeService ccs = component.Site.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (ccs != null)
{
ccs.ComponentRemoving += new ComponentEventHandler(DataGridViewDesigner_ComponentRemoving);
}
}
DataGridView dataGridView = (DataGridView) component;
// DataGridViewDesigner::Initialize runs after InitializeComponent was deserialized.
// just in case the user tinkered w/ InitializeComponent set AutoGenerateColumns to TRUE if there is no DataSource, otherwise set it to FALSE
dataGridView.AutoGenerateColumns = (dataGridView.DataSource == null);
// hook up the DataSourceChanged event, DataMemberChanged event
dataGridView.DataSourceChanged += new EventHandler(dataGridViewChanged);
dataGridView.DataMemberChanged += new EventHandler(dataGridViewChanged);
dataGridView.BindingContextChanged += new EventHandler(dataGridViewChanged);
// now add data bound columns
this.dataGridViewChanged(this.Component, EventArgs.Empty);
// Attach to column removed for clean up
dataGridView.ColumnRemoved += new DataGridViewColumnEventHandler(dataGridView_ColumnRemoved);
}
public override void InitializeNewComponent(IDictionary defaultValues) {
base.InitializeNewComponent(defaultValues);
((DataGridView) this.Component).ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
}
///
///
/// Gets the inheritance attribute for the data grid view.
///
///
protected override InheritanceAttribute InheritanceAttribute
{
get
{
if ((base.InheritanceAttribute == InheritanceAttribute.Inherited)
|| (base.InheritanceAttribute == InheritanceAttribute.InheritedReadOnly))
{
return InheritanceAttribute.InheritedReadOnly;
}
return base.InheritanceAttribute;
}
}
///
///
/// Gets the design-time verbs supported by the component associated with the
/// designer.
///
public override DesignerVerbCollection Verbs {
get {
if (designerVerbs == null) {
designerVerbs = new DesignerVerbCollection();
designerVerbs.Add(new DesignerVerb(SR.GetString(SR.DataGridViewEditColumnsVerb), new EventHandler(this.OnEditColumns)));
designerVerbs.Add(new DesignerVerb(SR.GetString(SR.DataGridViewAddColumnVerb), new EventHandler(this.OnAddColumn)));
}
return designerVerbs;
}
}
///
///
/// Gets the design-time action lists supported by the component associated with the
/// designer.
///
public override DesignerActionListCollection ActionLists {
get {
if (actionLists == null)
{
BuildActionLists();
}
return actionLists;
}
}
private void BuildActionLists() {
actionLists = new DesignerActionListCollection();
// ChooseDataSource action list
actionLists.Add(new DataGridViewChooseDataSourceActionList(this));
// column collection editing
actionLists.Add(new DataGridViewColumnEditingActionList(this));
// AllowUserToAddRows / ReadOnly / AllowUserToDeleteRows / AllowUserToOrderColumns
actionLists.Add(new DataGridViewPropertiesActionList(this));
// if one actionList has AutoShow == true then the chrome panel will popup when the user DnD the DataGridView onto the form
// It would make sense to promote AutoShow to DesignerActionListCollection.
// But we don't own the DesignerActionListCollection so we just set AutoShow on the first ActionList
//
actionLists[0].AutoShow = true;
}
private void dataGridViewChanged(object sender, EventArgs e) {
DataGridView dataGridView = (DataGridView) this.Component;
CurrencyManager newCM = null;
if (dataGridView.DataSource != null && dataGridView.BindingContext != null) {
newCM = (CurrencyManager) dataGridView.BindingContext[dataGridView.DataSource, dataGridView.DataMember];
}
if (newCM != this.cm) {
// unwire cm
if (this.cm != null) {
this.cm.MetaDataChanged -= new EventHandler(this.dataGridViewMetaDataChanged);
}
cm = newCM;
// wire cm
if (this.cm != null) {
this.cm.MetaDataChanged += new EventHandler(this.dataGridViewMetaDataChanged);
}
}
if (dataGridView.BindingContext == null) {
MakeSureColumnsAreSited(dataGridView);
return;
}
// the user changed the DataSource from null to something else
// Because AutoGenerateColumns is already set to true, all the bound columns are created
// Just set AutoGenerateColumns to false and return
if (dataGridView.AutoGenerateColumns && dataGridView.DataSource != null) {
Debug.Assert(String.IsNullOrEmpty(dataGridView.DataMember), "in the designer we can't set DataSource and DataMember at the same time. Did you forget to set AutoGenerateColumns to false at a previous stage?");
dataGridView.AutoGenerateColumns = false;
MakeSureColumnsAreSited(dataGridView);
return;
}
if (dataGridView.DataSource == null) {
if (dataGridView.AutoGenerateColumns) {
// the BindingContext changed;
// nothing to do
MakeSureColumnsAreSited(dataGridView);
return;
} else {
// DataSource changed from something to null
// set AutoGenerateColumns to true and remove the columns marked as DataBound
dataGridView.AutoGenerateColumns = true;
}
} else {
// we have a data source.
// set AutoGenerateColumns to false and party on the new DS/DM
dataGridView.AutoGenerateColumns = false;
}
RefreshColumnCollection();
}
private void DataGridViewDesigner_ComponentRemoving(object sender, ComponentEventArgs e)
{
DataGridView dataGridView = this.Component as DataGridView;
if (e.Component != null && e.Component == dataGridView.DataSource)
{
//
// The current data source was removed from the designer
// Set DataSource to null.
// This will:
// 1. clear DataGridView::DataSource.
// 2. clear DataGridView::DataMember.
// 3. delete the unbound data grid view columns from the DataGridView column collection.
// 4. set AutoGenerateColumns to TRUE.
//
IComponentChangeService ccs = (IComponentChangeService)GetService(typeof(IComponentChangeService));
string previousDataMember = dataGridView.DataMember;
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(dataGridView);
PropertyDescriptor dmPD = props != null ? props["DataMember"] : null;
if (ccs != null) {
if (dmPD != null) {
ccs.OnComponentChanging(dataGridView, dmPD);
}
}
dataGridView.DataSource = null;
if (ccs != null) {
if (dmPD != null) {
ccs.OnComponentChanged(dataGridView, dmPD, previousDataMember, "");
}
}
}
}
private void dataGridView_ColumnRemoved(object sender, DataGridViewColumnEventArgs e)
{
// Clear out the DisplayIndex for columns removed at design time.
// If we don't do this, the columns will be reordered after build when there are both databound
// columns and non databound columns. See VSWhidbey 572859. Ideally, we would do this on the Clear
// of the column collection but there is no event there and we are restricted from adding any
// Note: this does not break Undo/Redo because Undo/Redo uses serialization the same way
// the build does and DisplayIndex is not serialized
if (e.Column != null && e.Column.IsDataBound == false)
e.Column.DisplayIndex = -1;
}
private static void MakeSureColumnsAreSited(DataGridView dataGridView)
{
// Other designers ( VS Data ) may manipulate the column collection but not add the columns to the
// current container.
// So we have to make sure that the data grid view columns are sited on the current container.
IContainer currentContainer = dataGridView.Site != null ? dataGridView.Site.Container : null;
for (int i = 0; i < dataGridView.Columns.Count; i ++)
{
DataGridViewColumn col = dataGridView.Columns[i];
IContainer cont = col.Site != null ? col.Site.Container : null;
if (currentContainer != cont)
{
if (cont != null)
{
cont.Remove(col);
}
if (currentContainer != null)
{
currentContainer.Add(col);
}
}
}
}
protected override void PreFilterProperties(IDictionary properties)
{
base.PreFilterProperties(properties);
PropertyDescriptor prop;
// Handle shadowed properties
//
string[] shadowProps = new string[] {
"AutoSizeColumnsMode",
"DataSource"
};
Attribute[] empty = new Attribute[0];
for (int i = 0; i < shadowProps.Length; i++)
{
prop = (PropertyDescriptor)properties[shadowProps[i]];
if (prop != null)
{
properties[shadowProps[i]] = TypeDescriptor.CreateProperty(typeof(DataGridViewDesigner), prop, empty);
}
}
}
//
// If the previous schema and the current schema have common columns then ProcessSimilarSchema does the
// work of removing columns which are not common and returns TRUE.
// Otherwise ProcessSimilarSchema returns FALSE.
//
[SuppressMessage("Microsoft.Performance", "CA1808:AvoidCallsThatBoxValueTypes")]
private bool ProcessSimilarSchema(DataGridView dataGridView)
{
Debug.Assert(dataGridView.DataSource == null || this.cm != null, "if we have a data source we should also have a currency manager by now");
PropertyDescriptorCollection backEndProps = null;
if (cm != null)
{
try
{
backEndProps = cm.GetItemProperties();
}
catch (ArgumentException ex)
{
throw new InvalidOperationException(SR.GetString(SR.DataGridViewDataSourceNoLongerValid), ex);
}
}
IContainer currentContainer = dataGridView.Site != null ? dataGridView.Site.Container : null;
bool similarSchema = false;
for (int i = 0; i < dataGridView.Columns.Count; i ++)
{
DataGridViewColumn dataGridViewColumn = dataGridView.Columns[i];
if (String.IsNullOrEmpty(dataGridViewColumn.DataPropertyName))
{
continue;
}
PropertyDescriptor pd = TypeDescriptor.GetProperties(dataGridViewColumn)["UserAddedColumn"];
if (pd != null && (bool) pd.GetValue(dataGridViewColumn))
{
continue;
}
PropertyDescriptor dataFieldProperty = ( backEndProps != null ? backEndProps[dataGridViewColumn.DataPropertyName] : null);
// remove the column if the DataGridViewColumn::DataPropertyName does not map to any column anymore
// or if the DataGridViewColumn::DataPropertyName maps to a sub list
bool removeColumn = false;
if (dataFieldProperty == null)
{
// DataPropertyName does not map to a column anymore
removeColumn = true;
}
else if (typeofIList.IsAssignableFrom(dataFieldProperty.PropertyType))
{
// DataPropertyName may map to an Image column.
// Check for that using the Image TypeConverter
TypeConverter imageTypeConverter = TypeDescriptor.GetConverter(typeof(Image));
if (!imageTypeConverter.CanConvertFrom(dataFieldProperty.PropertyType))
{
// DataPropertyName points to a sub list.
removeColumn = true;
}
}
similarSchema = !removeColumn;
if (similarSchema)
{
break;
}
}
if (similarSchema)
{
IComponentChangeService changeService = this.Component.Site.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
PropertyDescriptor columnsProp = TypeDescriptor.GetProperties(this.Component)["Columns"];
try {
changeService.OnComponentChanging(this.Component, columnsProp);
}
catch (InvalidOperationException) {
return similarSchema;
}
for (int i = 0; i < dataGridView.Columns.Count;)
{
DataGridViewColumn dataGridViewColumn = dataGridView.Columns[i];
if (String.IsNullOrEmpty(dataGridViewColumn.DataPropertyName))
{
i++;
continue;
}
PropertyDescriptor pd = TypeDescriptor.GetProperties(dataGridViewColumn)["UserAddedColumn"];
if (pd != null && (bool) pd.GetValue(dataGridViewColumn))
{
i++;
continue;
}
PropertyDescriptor dataFieldProperty = ( backEndProps != null ? backEndProps[dataGridViewColumn.DataPropertyName] : null);
// remove the column if the DataGridViewColumn::DataPropertyName does not map to any column anymore
// or if the DataGridViewColumn::DataPropertyName maps to a sub list
bool removeColumn = false;
if (dataFieldProperty == null)
{
// DataPropertyName does not map to a column anymore
removeColumn = true;
}
else if (typeofIList.IsAssignableFrom(dataFieldProperty.PropertyType))
{
// DataPropertyName may map to an Image column.
// Check for that using the Image TypeConverter
TypeConverter imageTypeConverter = TypeDescriptor.GetConverter(typeof(Image));
if (!imageTypeConverter.CanConvertFrom(dataFieldProperty.PropertyType))
{
// DataPropertyName points to a sub list.
removeColumn = true;
}
}
if (removeColumn)
{
dataGridView.Columns.Remove(dataGridViewColumn);
if (currentContainer != null)
{
currentContainer.Remove(dataGridViewColumn);
}
}
else
{
i ++;
}
}
changeService.OnComponentChanged(this.Component, columnsProp, null, null);
}
return similarSchema;
}
[SuppressMessage("Microsoft.Performance", "CA1808:AvoidCallsThatBoxValueTypes")]
private void RefreshColumnCollection() {
DataGridView dataGridView = (DataGridView) this.Component;
ISupportInitializeNotification ds = dataGridView.DataSource as ISupportInitializeNotification;
if (ds != null && !ds.IsInitialized)
{
// The DataSource is not initialized yet.
// When the dataSource gets initialized it will send a MetaDataChanged event and at
// that point we will refresh the column collection.
return;
}
IComponentChangeService changeService = null;
PropertyDescriptor columnsProp = null;
IDesignerHost host = this.Component.Site.GetService(typeof(IDesignerHost)) as IDesignerHost;
// if after changing the data source / data member the dataGridView has columns which are still databound
// then keep them and don't change the column collection.
// we do this because bound columns represent the dataSource schema
// ALSO, we get Undo/Redo for free w/ this.
//
// For example: our data grid view is bound to a dataManager which in turns is bound to a web service
// which returns different dataSets w/ the same schema.
// If the user wants to see only the first 2 columns and makes some changes to the first two columns ( width, cell style, etc )
// then we don't want to throw these columns away when the dataManager receives another dataSet from the web service.
// and we don't want to add another columns
if (ProcessSimilarSchema(dataGridView))
{
return;
}
// Here is the sequence of actions to guarantee a good Undo/Redo:
//
// 1. OnComponentChanging DataGridView.Columns
// 2. Remove the columns which should be removed
// 3. OnComponentChanged DataGridView.Columns
// 4. IContainer.Remove(dataGridView.Columns)
// 5. IContainer.Add(new dataGridView.Columns)
// 6. OnComponentChanging DataGridView.Columns
// 7. DataGridView.Columns.Add( new DataGridViewColumns)
// 8. OnComponentChanged DataGridView.Columns
//
Debug.Assert(dataGridView.DataSource == null || this.cm != null, "if we have a data source we should also have a currency manager by now");
PropertyDescriptorCollection backEndProps = null;
if (cm != null)
{
try
{
backEndProps = cm.GetItemProperties();
}
catch (ArgumentException ex)
{
throw new InvalidOperationException(SR.GetString(SR.DataGridViewDataSourceNoLongerValid), ex);
}
}
IContainer currentContainer = dataGridView.Site != null ? dataGridView.Site.Container : null;
changeService = this.Component.Site.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
columnsProp = TypeDescriptor.GetProperties(this.Component)["Columns"];
// 1. OnComponentChanging DataGridView.Columns
changeService.OnComponentChanging(this.Component, columnsProp);
DataGridViewColumn[] removeColumns = new DataGridViewColumn[dataGridView.Columns.Count];
int removeColumnsCount = 0;
for (int i = 0; i < dataGridView.Columns.Count; i ++)
{
DataGridViewColumn col = dataGridView.Columns[i];
if (!String.IsNullOrEmpty(col.DataPropertyName))
{
PropertyDescriptor pd = TypeDescriptor.GetProperties(col)["UserAddedColumn"];
if (pd == null || !((bool) pd.GetValue(col)))
{
removeColumns[removeColumnsCount] = col;
removeColumnsCount ++;
}
}
}
// 2. Remove the columns which should be removed
for (int i = 0; i < removeColumnsCount; i ++)
{
dataGridView.Columns.Remove(removeColumns[i]);
}
// 3. OnComponentChanged DataGridView.Columns
changeService.OnComponentChanged(this.Component, columnsProp, null, null);
// 4. IContainer.Remove(dataGridView.Columns)
if (currentContainer != null)
{
for (int i = 0; i < removeColumnsCount; i ++)
{
currentContainer.Remove(removeColumns[i]);
}
}
DataGridViewColumn[] columnsToBeAdded = null;
int columnsToBeAddedCount = 0;
if (dataGridView.DataSource != null)
{
columnsToBeAdded = new DataGridViewColumn[backEndProps.Count];
columnsToBeAddedCount = 0;
for (int i = 0; i < backEndProps.Count; i ++)
{
DataGridViewColumn dataGridViewColumn = null;
TypeConverter imageTypeConverter = TypeDescriptor.GetConverter(typeof(System.Drawing.Image));
Type propType = backEndProps[i].PropertyType;
Type columnType;
if (typeof(IList).IsAssignableFrom(propType)) {
if (imageTypeConverter.CanConvertFrom(propType))
{
columnType = typeofDataGridViewImageColumn;
}
else
{
continue;
}
} else if (propType == typeof(bool) || propType == typeof(CheckState)) {
columnType = typeofDataGridViewCheckBoxColumn;
} else if (typeof(System.Drawing.Image).IsAssignableFrom(propType) || imageTypeConverter.CanConvertFrom(propType)) {
columnType = typeofDataGridViewImageColumn;
} else {
columnType = typeofDataGridViewTextBoxColumn;
}
string nameFromText = ToolStripDesigner.NameFromText(backEndProps[i].Name, columnType, this.Component.Site);
//
// host.CreateComponent adds the column to its list of components
//
// 5. IContainer.Add(newDataGridView.Columns
//
dataGridViewColumn = TypeDescriptor.CreateInstance(host, columnType, null, null) as DataGridViewColumn;
dataGridViewColumn.DataPropertyName = backEndProps[i].Name;
dataGridViewColumn.HeaderText = !String.IsNullOrEmpty(backEndProps[i].DisplayName) ? backEndProps[i].DisplayName : backEndProps[i].Name;
dataGridViewColumn.Name = backEndProps[i].Name;
dataGridViewColumn.ValueType = backEndProps[i].PropertyType;
dataGridViewColumn.ReadOnly = backEndProps[i].IsReadOnly;
host.Container.Add(dataGridViewColumn, nameFromText);
columnsToBeAdded[columnsToBeAddedCount] = dataGridViewColumn;
columnsToBeAddedCount ++;
}
}
// 6. OnComponentChanging DataGridView.Columns
changeService.OnComponentChanging(this.Component, columnsProp);
// 7. DataGridView.Columns.Add( new DataGridViewColumns)
for (int i = 0; i < columnsToBeAddedCount; i ++)
{
// wipe out the display index
columnsToBeAdded[i].DisplayIndex = -1;
dataGridView.Columns.Add(columnsToBeAdded[i]);
}
// 8. OnComponentChanged DataGridView.Columns
changeService.OnComponentChanged(this.Component, columnsProp, null, null);
}
private bool ShouldSerializeAutoSizeColumnsMode()
{
DataGridView dataGridView = this.Component as DataGridView;
if (dataGridView != null)
{
return dataGridView.AutoSizeColumnsMode != DataGridViewAutoSizeColumnsMode.None;
}
else
{
return false;
}
}
private bool ShouldSerializeDataSource()
{
return ((DataGridView) this.Component).DataSource != null;
}
// Ideally there would be a public method like this somewhere.
internal static void ShowErrorDialog(IUIService uiService, Exception ex, Control dataGridView)
{
if (uiService != null)
{
uiService.ShowError(ex);
}
else
{
string message = ex.Message;
if (message == null || message.Length == 0) {
message = ex.ToString();
}
RTLAwareMessageBox.Show(dataGridView, message, null, MessageBoxButtons.OK, MessageBoxIcon.Exclamation,
MessageBoxDefaultButton.Button1, 0);
}
}
internal static void ShowErrorDialog(IUIService uiService, string errorString, Control dataGridView)
{
if (uiService != null)
{
uiService.ShowError(errorString);
}
else
{
RTLAwareMessageBox.Show(dataGridView, errorString, null, MessageBoxButtons.OK, MessageBoxIcon.Exclamation,
MessageBoxDefaultButton.Button1, 0);
}
}
private void dataGridViewMetaDataChanged(object sender, EventArgs e)
{
RefreshColumnCollection();
}
public void OnEditColumns(object sender, EventArgs e) {
IDesignerHost host = Component.Site.GetService(typeof(IDesignerHost)) as IDesignerHost;
DataGridViewColumnCollectionDialog dialog = new DataGridViewColumnCollectionDialog();
dialog.SetLiveDataGridView((DataGridView) this.Component);
DesignerTransaction transaction = host.CreateTransaction(SR.GetString(SR.DataGridViewEditColumnsTransactionString));
DialogResult result = DialogResult.Cancel;
try {
result = this.ShowDialog(dialog);
} finally {
if (result == DialogResult.OK) {
transaction.Commit();
} else {
transaction.Cancel();
}
}
}
public void OnAddColumn(object sender, EventArgs e) {
IDesignerHost host = Component.Site.GetService(typeof(IDesignerHost)) as IDesignerHost;
DesignerTransaction transaction = host.CreateTransaction(SR.GetString(SR.DataGridViewAddColumnTransactionString));
DialogResult result = DialogResult.Cancel;
DataGridViewAddColumnDialog dialog = new DataGridViewAddColumnDialog(((DataGridView)this.Component).Columns, (DataGridView) this.Component);
dialog.Start(((DataGridView)this.Component).Columns.Count, true /*persistChangesToDesigner*/);
try {
result = this.ShowDialog(dialog);
} finally {
if (result == DialogResult.OK) {
transaction.Commit();
} else {
transaction.Cancel();
}
}
}
private DialogResult ShowDialog(Form dialog) {
IUIService uiSvc = this.Component.Site.GetService(typeof(IUIService)) as IUIService;
if (uiSvc != null) {
return uiSvc.ShowDialog(dialog);
} else {
return dialog.ShowDialog(this.Component as IWin32Window);
}
}
[ComplexBindingProperties("DataSource", "DataMember")]
private class DataGridViewChooseDataSourceActionList : DesignerActionList {
DataGridViewDesigner owner;
public DataGridViewChooseDataSourceActionList(DataGridViewDesigner owner) : base(owner.Component) {
this.owner = owner;
}
public override DesignerActionItemCollection GetSortedActionItems() {
DesignerActionItemCollection items = new DesignerActionItemCollection();
DesignerActionPropertyItem chooseDataSource = new DesignerActionPropertyItem("DataSource", // property name
SR.GetString(SR.DataGridViewChooseDataSource));// displayName
chooseDataSource.RelatedComponent = this.owner.Component;
items.Add(chooseDataSource);
return items;
}
[AttributeProvider(typeof(IListSource))]
public object DataSource {
[
SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode") // DAP calls this method thru Reflection.
]
get {
// Use the shadow property which is defined on the designer.
return this.owner.DataSource;
}
[
SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode") // DAP calls this method thru Reflection.
]
set {
// left to do: transaction stuff
DataGridView dataGridView = (DataGridView) this.owner.Component;
IDesignerHost host = this.owner.Component.Site.GetService(typeof(IDesignerHost)) as IDesignerHost;
PropertyDescriptor dataSourceProp = TypeDescriptor.GetProperties(dataGridView)["DataSource"];
IComponentChangeService changeService = this.owner.Component.Site.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
DesignerTransaction transaction = host.CreateTransaction(SR.GetString(SR.DataGridViewChooseDataSourceTransactionString, dataGridView.Name));
try {
changeService.OnComponentChanging(this.owner.Component, dataSourceProp);
// Use the shadow property which is defined on the designer.
this.owner.DataSource = value;
changeService.OnComponentChanged(this.owner.Component, dataSourceProp, null, null);
transaction.Commit();
transaction = null;
} finally {
if(transaction != null) {
transaction.Cancel();
}
}
}
}
}
private class DataGridViewColumnEditingActionList : DesignerActionList {
DataGridViewDesigner owner;
public DataGridViewColumnEditingActionList(DataGridViewDesigner owner) : base (owner.Component) {
this.owner = owner;
}
public override DesignerActionItemCollection GetSortedActionItems() {
DesignerActionItemCollection items = new DesignerActionItemCollection();
items.Add(new DesignerActionMethodItem(this,
"EditColumns", // method name
SR.GetString(SR.DataGridViewEditColumnsVerb), // display name
true)); // promoteToDesignerVerb
items.Add(new DesignerActionMethodItem(this,
"AddColumn", // method name
SR.GetString(SR.DataGridViewAddColumnVerb), // display name
true)); // promoteToDesignerVerb
return items;
}
[
SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode") // DAP calls this method thru Reflection.
]
public void EditColumns() {
this.owner.OnEditColumns(this, EventArgs.Empty);
}
[
SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode") // DAP calls this method thru Reflection.
]
public void AddColumn() {
this.owner.OnAddColumn(this, EventArgs.Empty);
}
}
private class DataGridViewPropertiesActionList : DesignerActionList {
DataGridViewDesigner owner;
public DataGridViewPropertiesActionList(DataGridViewDesigner owner) : base (owner.Component) {
this.owner = owner;
}
public override DesignerActionItemCollection GetSortedActionItems() {
DesignerActionItemCollection items = new DesignerActionItemCollection();
items.Add(new DesignerActionPropertyItem("AllowUserToAddRows",
SR.GetString(SR.DataGridViewEnableAdding)));
items.Add(new DesignerActionPropertyItem("ReadOnly",
SR.GetString(SR.DataGridViewEnableEditing)));
items.Add(new DesignerActionPropertyItem("AllowUserToDeleteRows",
SR.GetString(SR.DataGridViewEnableDeleting)));
items.Add(new DesignerActionPropertyItem("AllowUserToOrderColumns",
SR.GetString(SR.DataGridViewEnableColumnReordering)));
return items;
}
public bool AllowUserToAddRows {
[
SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode") // DAP calls this method thru Reflection.
]
get {
return ((DataGridView)this.owner.Component).AllowUserToAddRows;
}
[
SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode") // DAP calls this method thru Reflection.
]
set {
if (value != this.AllowUserToAddRows) {
IDesignerHost host = this.owner.Component.Site.GetService(typeof(IDesignerHost)) as IDesignerHost;
DesignerTransaction transaction;
if (value) {
transaction = host.CreateTransaction(SR.GetString(SR.DataGridViewEnableAddingTransactionString));
} else {
transaction = host.CreateTransaction(SR.GetString(SR.DataGridViewDisableAddingTransactionString));
}
try {
IComponentChangeService changeService = this.owner.Component.Site.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
PropertyDescriptor prop = TypeDescriptor.GetProperties(this.owner.Component)["AllowUserToAddRows"];
changeService.OnComponentChanging(this.owner.Component, prop);
((DataGridView)this.owner.Component).AllowUserToAddRows = value;
changeService.OnComponentChanged(this.owner.Component, prop, null, null);
transaction.Commit();
transaction = null;
} finally {
if(transaction!=null) {
transaction.Cancel();
}
}
}
}
}
public bool AllowUserToDeleteRows {
[
SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode") // DAP calls this method thru Reflection.
]
get {
return ((DataGridView)this.owner.Component).AllowUserToDeleteRows;
}
[
SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode") // DAP calls this method thru Reflection.
]
set {
if (value != this.AllowUserToDeleteRows) {
IDesignerHost host = this.owner.Component.Site.GetService(typeof(IDesignerHost)) as IDesignerHost;
DesignerTransaction transaction;
if (value) {
transaction = host.CreateTransaction(SR.GetString(SR.DataGridViewEnableDeletingTransactionString));
} else {
transaction = host.CreateTransaction(SR.GetString(SR.DataGridViewDisableDeletingTransactionString));
}
try {
IComponentChangeService changeService = this.owner.Component.Site.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
PropertyDescriptor prop = TypeDescriptor.GetProperties(this.owner.Component)["AllowUserToDeleteRows"];
changeService.OnComponentChanging(this.owner.Component, prop);
((DataGridView)this.owner.Component).AllowUserToDeleteRows = value;
changeService.OnComponentChanged(this.owner.Component, prop, null, null);
transaction.Commit();
transaction = null;
} finally {
if(transaction != null) {
transaction.Cancel();
}
}
}
}
}
public bool AllowUserToOrderColumns {
[
SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode") // DAP calls this method thru Reflection.
]
get {
return ((DataGridView)this.owner.Component).AllowUserToOrderColumns;
}
[
SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode") // DAP calls this method thru Reflection.
]
set {
if (value != this.AllowUserToOrderColumns) {
IDesignerHost host = this.owner.Component.Site.GetService(typeof(IDesignerHost)) as IDesignerHost;
DesignerTransaction transaction;
if (value) {
transaction = host.CreateTransaction(SR.GetString(SR.DataGridViewEnableColumnReorderingTransactionString));
} else {
transaction = host.CreateTransaction(SR.GetString(SR.DataGridViewDisableColumnReorderingTransactionString));
}
try {
IComponentChangeService changeService = this.owner.Component.Site.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
PropertyDescriptor prop = TypeDescriptor.GetProperties(this.owner.Component)["AllowUserToReorderColumns"];
changeService.OnComponentChanging(this.owner.Component, prop);
((DataGridView)this.owner.Component).AllowUserToOrderColumns = value;
changeService.OnComponentChanged(this.owner.Component, prop, null, null);
transaction.Commit();
transaction = null;
} finally {
if(transaction != null) {
transaction.Cancel();
}
}
}
}
}
public bool ReadOnly {
[
SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode") // DAP calls this method thru Reflection.
]
get {
return !((DataGridView)this.owner.Component).ReadOnly;
}
[
SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode") // DAP calls this method thru Reflection.
]
set {
if (value != this.ReadOnly) {
IDesignerHost host = this.owner.Component.Site.GetService(typeof(IDesignerHost)) as IDesignerHost;
DesignerTransaction transaction;
if (value) {
transaction = host.CreateTransaction(SR.GetString(SR.DataGridViewEnableEditingTransactionString));
} else {
transaction = host.CreateTransaction(SR.GetString(SR.DataGridViewDisableEditingTransactionString));
}
try {
IComponentChangeService changeService = this.owner.Component.Site.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
PropertyDescriptor prop = TypeDescriptor.GetProperties(this.owner.Component)["ReadOnly"];
changeService.OnComponentChanging(this.owner.Component, prop);
((DataGridView)this.owner.Component).ReadOnly = !value;
changeService.OnComponentChanged(this.owner.Component, prop, null, null);
transaction.Commit();
transaction = null;
} finally {
if(transaction!=null) {
transaction.Cancel();
}
}
}
}
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SQLStringStorage.cs
- ObjectItemAttributeAssemblyLoader.cs
- StoryFragments.cs
- ParseNumbers.cs
- ResourcesBuildProvider.cs
- EntityDataSourceColumn.cs
- RecognizeCompletedEventArgs.cs
- CacheRequest.cs
- ListCommandEventArgs.cs
- DependencyProperty.cs
- CustomCredentialPolicy.cs
- FindProgressChangedEventArgs.cs
- WebPartDescriptionCollection.cs
- SecurityElement.cs
- JavaScriptObjectDeserializer.cs
- DbConvert.cs
- HatchBrush.cs
- RoleManagerEventArgs.cs
- ReadOnlyDataSource.cs
- DecoratedNameAttribute.cs
- PropertyDescriptorGridEntry.cs
- PersonalizableTypeEntry.cs
- CharacterString.cs
- Sql8ConformanceChecker.cs
- EncoderParameter.cs
- DbParameterHelper.cs
- DataViewSettingCollection.cs
- OrderedDictionaryStateHelper.cs
- BaseTreeIterator.cs
- IPHostEntry.cs
- SqlClientWrapperSmiStream.cs
- InheritanceUI.cs
- StorageSetMapping.cs
- DoubleLinkListEnumerator.cs
- ValidationRuleCollection.cs
- ServiceXNameTypeConverter.cs
- LineInfo.cs
- GraphicsPath.cs
- ServiceDebugBehavior.cs
- State.cs
- SchemaInfo.cs
- StringToken.cs
- LineServicesCallbacks.cs
- DataGridViewTextBoxColumn.cs
- ContentType.cs
- ElementProxy.cs
- StrictAndMessageFilter.cs
- ListSourceHelper.cs
- XmlJsonWriter.cs
- SlipBehavior.cs
- TouchesCapturedWithinProperty.cs
- DesignerTransactionCloseEvent.cs
- Border.cs
- URI.cs
- SignedXml.cs
- QueueAccessMode.cs
- EnglishPluralizationService.cs
- ViewKeyConstraint.cs
- HtmlImage.cs
- EllipseGeometry.cs
- ThreadAttributes.cs
- XmlUrlResolver.cs
- HtmlLabelAdapter.cs
- safesecurityhelperavalon.cs
- FragmentQueryKB.cs
- ProtocolsSection.cs
- ConfigXmlDocument.cs
- ValidationSummary.cs
- ToolTip.cs
- DataGridViewSelectedRowCollection.cs
- FrugalMap.cs
- ByteArrayHelperWithString.cs
- CheckBoxFlatAdapter.cs
- StylusDownEventArgs.cs
- OdbcDataReader.cs
- TabControl.cs
- XmlNamedNodeMap.cs
- FilteredDataSetHelper.cs
- documentsequencetextcontainer.cs
- PrimitiveCodeDomSerializer.cs
- ProviderConnectionPointCollection.cs
- AlternateView.cs
- DataColumnCollection.cs
- indexingfiltermarshaler.cs
- GridViewRowCollection.cs
- SymbolPair.cs
- DesignBindingEditor.cs
- XmlDownloadManager.cs
- EventLogPermission.cs
- _ListenerResponseStream.cs
- WinHttpWebProxyFinder.cs
- RootProfilePropertySettingsCollection.cs
- DataRelation.cs
- Transform3D.cs
- SelectionPatternIdentifiers.cs
- TcpAppDomainProtocolHandler.cs
- UncommonField.cs
- SendSecurityHeader.cs
- XAMLParseException.cs
- HebrewCalendar.cs