private void InitializeControls()
{
btnAdd.Click += new System.EventHandler(Add_Click);
btnEdit.Click += new System.EventHandler(Edit_Click);
btnDelete.Click += new System.EventHandler(Delete_Click);
dg.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(DataGrid_PageIndexChanged);
public override void DataBind()
{
dg.DataBind();
base.DataBind ();
}
[DefaultValueAttribute(null)]
[EditorAttribute(typeof(System.Web.UI.Design.WebControls.DataGridColumnCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))]
[MergableProperty (false)]
[PersistenceMode (PersistenceMode.InnerProperty)]
public virtual DataGridColumnCollection Columns
{
get
return dg.Columns;
}
}
[Bindable(true),
Category("Data"),
DefaultValue(null),
Description("The datasource that is used to populate the list with items."),
// needs to be hidden otherwise we don't save the property for some reason
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)
]
public object DataSource
{
get { return _dataSource; }
set
{
if ((value == null) || (value is IListSource) || (value is IEnumerable))
{
_dataSource = value;
if (_dataSource!=null)
{
dg.DataSource = this._dataSource;
dg.DataBind();
}
}
else
throw new Exception("Invalid datasource.");
}
}
/// <summary>
/// The table used for binding when a DataSet is used as the DataSource.
/// </summary>
[
Bindable(false),
Category("Data"),
DefaultValue(""),
Description("The table used for binding when a DataSet is used as the DataSource.")
]
public string DataMember
{
get
{
return _dataMember;
}
set
{
_dataMember = value;
}
}
/// <summary>
/// Render this control to the output parameter specified.
/// </summary>
/// <param name="output"> The HTML writer to write out to </param>
protected override void Render(HtmlTextWriter output)
{
tbl.RenderControl(output);
}
}
Microsoft uber alles!!!
Re[3]: DataGridColumnCollection - в Custom WebControl
Некоторые малозначащие свойства (ItemsStyle, HeaderStyle и тд и тп) я убрал, дабы уменьшить размер поста,
и в свойстве Columns забыл скобочку { — ну а в остальном всё так как в жизни.
прописка EnsureChildControls перед return dg.Columns; , ничего не дала, ошибка таже, Cast is not valid.
Поможите!!!!
С уважением,
Potandr
Microsoft uber alles!!!
Re: DataGridColumnCollection - в Custom WebControl
RE: Re[2]: DataGridColumnCollection - в Custom WebControl
От:
Аноним
Дата:
27.09.06 09:31
Оценка:
1. INamingContainer не нужен.
2. Все создание контролов переносишь в CreateChildControls(), все созданные контролы добавляешь в коллекцию Controls.
3. Пишешь
public override ControlCollection Controls {
get {
EnsureChildControls();
return base.Controls;
}
}
4. DataBind() и Render() не нужно переопределять.
5. Все обращения к внутренним контролам делай через Controls.
Вроде все.
Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
public class DataGridColumnCollectionEditor : UITypeEditor
{
public DataGridColumnCollectionEditor(){}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
IDesignerHost host1 = (IDesignerHost) context.GetService(typeof(IDesignerHost));
DataGrid grid1 = (DataGrid) context.Instance;
((BaseDataListDesigner) host1.GetDesigner(grid1)).InvokePropertyBuilder(DataGridComponentEditor.IDX_COLUMNS);
return value;
}
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
}
в выделеной строчке, контекстом является ТВОЙ контрол который содержит нрид но не может быть к нему приведен, поэтому и падает.
более того следующий код ( InvokePropertyBuilder ) тоже привязан к тому что вызвающий код грид.
попозже попробую переделать этот дизайнер — если получится, напишу.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: DataGridColumnCollection - в Custom WebControl
Здравствуйте, mogadanez, Вы писали:
M>попозже попробую переделать этот дизайнер — если получится, напишу.
Думаю полностью это сделать нереально. вот пример частично работающего кода
public class CustomDataGridColumnCollectionEditor : UITypeEditor
{
public CustomDataGridColumnCollectionEditor(){}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
DataGrid grd = ( (GridEx) context.Instance ).GetDataGrid();
BaseDataListDesigner designer = new System.Web.UI.Design.WebControls.DataGridDesigner();
designer.Initialize( grd );
untyped_object.call_method( designer, "InvokePropertyBuilder", 1 );
return value;
}
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
}
по крайней мере дизайнер открывается — но с ошибкой, копаться в потрохах не охота, да и тебе не советую.
ибо идея твоя в принципе порочна... Сам подумай куда дизайнер сохранит выбранные тобой колонки?
на странице нет описания грида — только твоего контрола.
есть другое предложение — почему не сделать твой контрол наследным от грида?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: DataGridColumnCollection - в Custom WebControl
Здравствуйте, mogadanez, Вы писали:
M>Думаю полностью это сделать нереально.
Хм, поборим, где наша не пропадала — наша пропадала везде.
М>Сам подумай куда дизайнер сохранит выбранные тобой колонки? M>на странице нет описания грида — только твоего контрола.
Думаю, что нужно ещё и Designer писать , и ставить флажки сериализации соответствующие,
во всяком случае DataSource так прикручен.
M>есть другое предложение — почему не сделать твой контрол наследным от грида?
слишком просто , для того кто пишет контрол, и слишком сложно для того кто будет на кучу формочек раз за разом ложить одни и теже группы контролов, в разных приложениях, согласись.
Ну и потом надож круть показать )))
И вопрос ещё, этот вызов и какого Framework-a? я пишу для первого.
Microsoft uber alles!!!
Re[4]: DataGridColumnCollection - в Custom WebControl
Здравствуйте, Potandr, Вы писали:
P>Здравствуйте, Potandr, Вы писали:
P>>И вопрос ещё, этот вызов и какого Framework-a? я пишу для первого.
P>имелся ввиду вот этот untyped_object.call_method