DataGridColumnCollection - в Custom WebControl
От: Potandr нету у меня такой, пока
Дата: 26.09.06 14:28
Оценка:
Привет, всем.
Друзья! пишу WebControl который содержит DataGrid, дабы пользователь мог настраивать столбцы оперделяю такое вот свойство:

[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; //dg — это собственно DataGrid
}
}

Выклыдываю контрол на WebPagе, смотрю его свойства, кликаю мышкой на Columns — выдаёт Specified Cust is not valid.
мож кто шо подскажет
Microsoft uber alles!!!
RE: DataGridColumnCollection - в Custom WebControl
От: Аноним  
Дата: 26.09.06 16:14
Оценка:
Где сам грид создается, надеюсь в CreateChildControls()? Тогда

public virtual DataGridColumnCollection Columns
{
get
{
EnsureChildControls();
return dg.Columns; //dg — это собственно DataGrid
}
}
Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: DataGridColumnCollection - в Custom WebControl
От: Potandr нету у меня такой, пока
Дата: 27.09.06 06:27
Оценка:
Здравствуйте, Dimon aka Manowar, Вы писали:

DAM>Где сам грид создается, надеюсь в CreateChildControls()?

Собственно вот сам контрол:

[DefaultProperty("DataSource"),
ToolboxData("<{0}:GridEx runat=server></{0}:GridEx>"),
Designer(typeof(WCL.Design.GridExDesigner))]
public class GridEx : WebControl, INamingContainer
{
private string _dataMember=null;
private object _dataSource=null;
private DataGrid dg = new DataGrid();

private Button btnAdd = new Button();
private Button btnEdit = new Button();
private Button btnDelete = new Button();
private Button btnFilter = new Button();

private Table tbl = new Table();
private TableRow row0 = new TableRow();
private TableRow row1 = new TableRow();

private TableCell cell11 = new TableCell();
private TableCell cell12 = new TableCell();
private TableCell cell13 = new TableCell();
private TableCell cell21 = new TableCell();

private ArrayList columns_list;
private DataGridColumnCollection columns;


public GridEx()
{

btnAdd.Height =
btnEdit.Height =
btnDelete.Height =
btnFilter.Height =
Unit.Parse("20px");

System.Drawing.ColorConverter cc = new ColorConverter();
/////////////////////////// Инициализируем DataGrid (настройки по умолчанию)////////////
dg.AllowPaging = true;
dg.PagerStyle.Mode = System.Web.UI.WebControls.PagerMode.NumericPages;
dg.PagerStyle.Font.Size = FontUnit.Parse("7pt");
dg.HeaderStyle.BackColor = System.Drawing.SystemColors.Highlight;
dg.HeaderStyle.ForeColor = System.Drawing.SystemColors.InactiveCaption;

dg.PagerStyle.BackColor = System.Drawing.SystemColors.Highlight;
dg.PagerStyle.ForeColor = (Color)cc.ConvertFromString("Yellow");
dg.PageSize = 21;
dg.CurrentPageIndex =0;

dg.AllowSorting = true;
dg.GridLines = GridLines.None;
cell21.Width = Unit.Parse("100%");
tbl.Width = Unit.Parse("100%");
}
public DataGrid GetDataGrid()
{
return dg;
}
public void DesingTimeDraw()
{
this.EnsureChildControls();
}
protected override void OnInit(EventArgs e)
{
InitializeControls();
base.OnInit (e);
}

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);

}

private void DataGrid_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
dg.CurrentPageIndex = e.NewPageIndex;
dg.DataBind();
}

private void Add_Click(object sender, System.EventArgs e)
{
}
private void Edit_Click(object sender, System.EventArgs e)
{
}
private void Delete_Click(object sender, System.EventArgs e)
{
}
protected override void CreateChildControls()
{
Controls.Add(tbl);
btnAdd.Text = "Добавить";
btnEdit.Text = "Редактировать";
btnDelete.Text = "Удалить";
btnFilter.Text = "Фильтр";


cell11.Controls.Add(btnAdd);
cell11.Controls.Add(btnEdit);
cell11.Controls.Add(btnDelete);
cell11.Controls.Add(btnFilter);

cell21.Controls.Add(dg);

row0.Cells.Add(cell11);
row0.Cells.Add(cell12);
row0.Cells.Add(cell13);

row1.Cells.Add(cell21);
cell21.ColumnSpan = 3;
tbl.Rows.Add(row0);
tbl.Rows.Add(row1);
}

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
От: Potandr нету у меня такой, пока
Дата: 27.09.06 06:34
Оценка:
Некоторые малозначащие свойства (ItemsStyle, HeaderStyle и тд и тп) я убрал, дабы уменьшить размер поста,
и в свойстве Columns забыл скобочку { — ну а в остальном всё так как в жизни.

прописка EnsureChildControls перед return dg.Columns; , ничего не дала, ошибка таже, Cast is not valid.

Поможите!!!!

С уважением,
Potandr
Microsoft uber alles!!!
Re: DataGridColumnCollection - в Custom WebControl
От: mogadanez Чехия  
Дата: 27.09.06 09:25
Оценка:
Здравствуйте, Potandr, Вы писали:

1.1 или 2.0?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
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.
Вроде все.
Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: DataGridColumnCollection - в Custom WebControl
От: mogadanez Чехия  
Дата: 27.09.06 10:29
Оценка:
P>Выклыдываю контрол на WebPagе, смотрю его свойства, кликаю мышкой на Columns — выдаёт Specified Cust is not valid.
P>мож кто шо подскажет

Дело не в твоем контроле, а в дизайнере который ты пытаешься использовать
P>[EditorAttribute(typeof(System.Web.UI.Design.WebControls.DataGridColumnCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))]


если глянуть на него рефлектором

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 Чехия  
Дата: 27.09.06 11:32
Оценка:
Здравствуйте, 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
От: Potandr нету у меня такой, пока
Дата: 27.09.06 13:29
Оценка:
Здравствуйте, mogadanez, Вы писали:

M>Думаю полностью это сделать нереально.

Хм, поборим, где наша не пропадала — наша пропадала везде.

М>Сам подумай куда дизайнер сохранит выбранные тобой колонки?

M>на странице нет описания грида — только твоего контрола.

Думаю, что нужно ещё и Designer писать , и ставить флажки сериализации соответствующие,
во всяком случае DataSource так прикручен.

M>есть другое предложение — почему не сделать твой контрол наследным от грида?


слишком просто , для того кто пишет контрол, и слишком сложно для того кто будет на кучу формочек раз за разом ложить одни и теже группы контролов, в разных приложениях, согласись.
Ну и потом надож круть показать )))

И вопрос ещё, этот вызов и какого Framework-a? я пишу для первого.
Microsoft uber alles!!!
Re[4]: DataGridColumnCollection - в Custom WebControl
От: Potandr нету у меня такой, пока
Дата: 27.09.06 13:31
Оценка:
Здравствуйте, Potandr, Вы писали:

P>И вопрос ещё, этот вызов и какого Framework-a? я пишу для первого.


имелся ввиду вот этот untyped_object.call_method
Microsoft uber alles!!!
Re[5]: DataGridColumnCollection - в Custom WebControl
От: mogadanez Чехия  
Дата: 27.09.06 13:39
Оценка:
Здравствуйте, Potandr, Вы писали:

P>Здравствуйте, Potandr, Вы писали:


P>>И вопрос ещё, этот вызов и какого Framework-a? я пишу для первого.


P>имелся ввиду вот этот untyped_object.call_method


FW 1.1
это ReflectionHelper
а тут его обновляемая версия.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: DataGridColumnCollection - в Custom WebControl
От: Potandr нету у меня такой, пока
Дата: 28.09.06 08:36
Оценка:
Здравствуйте, mogadanez, Вы писали:

M>FW 1.1

M>это ReflectionHelper
M>а тут его обновляемая версия.



Спасиб за ответы. если получится реализовать — напишу.
Microsoft uber alles!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.