Как получить ссылку на telerik: GridTemplateColumn из дочернего элемента управления? - PullRequest
1 голос
/ 21 апреля 2011

Упрощенный код со страницы:

<%@ Page Language="C#" etc... %>
<%@ Register src="~/controls/RequiredField.ascx" tagname="rf" tagprefix="custom" %>

<telerik:RadGrid runat="server">
    <MasterTableView>
        <Columns>
            <telerik:GridTemplateColumn DataField="Name" HeaderText="Name" SortExpression="Name">
                <ItemTemplate><%#Eval("Name")%></ItemTemplate>                    
                <EditItemTemplate>
                    <asp:TextBox ID="NewName" runat="server" Text='<%#Bind("Name")%>'></asp:TextBox>
                    <custom:rf runat="server" />
                </EditItemTemplate>
            </telerik:GridTemplateColumn>
        </Columns>
    </MasterTableView>
</telerik:RadGrid>

В моем контроле я хочу проверить, является ли родительский элемент EditItemTemplate, а затем установить свойство telerik:GridTemplateColumn.Например:

public partial class controls_RequiredField : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (this.Parent is Telerik.Web.UI.GridEditFormItem.EditFormTableCell)
        {
            // how do I get a reference to 'Telerik.Web.UI.GridTemplateColumn' (or any other object that lets me set the header text)
            ((Telerik.Web.UI.GridTemplateColumn)this.Parent.Parent).EditFormHeaderTextFormat = "{0}:" + RequiredText.Text;
            RequiredText.Visible = false;
        }
    }
}

Ответы [ 2 ]

1 голос
/ 21 апреля 2011

У меня нет telerik:RadGrid, но он очень похож на MS GridView, поэтому я смог проверить вашу проблему, используя asp:GridView (оба наследуются от Класс CompositeDataBoundControl (System.Web.UI.WebControls) )

, поскольку ваш пользовательский элемент управления находится в EditItemTemplate событии Page_Load вашего элемента управления RequiredField, которое не сработает, пока RadGrid не переключится в режим редактирования, поэтому вы сможете сбросить проверку if (this.Parent is...) при Вы узнаете, что сетка находится в режиме редактирования.

Таким образом, при загрузке страницы пользовательского элемента управления, указывающей, что сетка находится в режиме редактирования, вы можете установить HeaderText для GridTemplateColumn, выполнив что-то вроде:

if (typeof(DataControlFieldCell) == Parent.GetType())
{
    ((DataControlFieldCell)this.Parent).ContainingField.HeaderText = "Your Custom Heading"; // Or += if appending
}
0 голосов
/ 21 апреля 2011

Хорошо, это код, который я сейчас использую, который работает:

protected void Page_Init(object sender, EventArgs e)
{
    if (this.Parent is GridEditFormItem.EditFormTableCell)
    {
        GridEditFormItem.EditFormTableCell parentCell = (GridEditFormItem.EditFormTableCell)this.Parent;
        string col = parentCell.ColumnName;
        // ridiculous:
        Control parentFormItem = this.Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent;
        if (parentFormItem is GridItem)
        {
            GridItem gi = (GridItem)parentFormItem;
            GridColumn parentColumn = gi.OwnerTableView.Columns.FindByUniqueNameSafe(col);
            if (parentColumn != null)
            {
                parentColumn.EditFormHeaderTextFormat = "{0}:" + RequiredText.Text;
                RequiredText.Visible = false;
            }
        }
    }
}

Но необходимость циклически проходить все эти .Parent s делает меня неловким.

...