Как программно достичь любого AspxControl внутри EditItemTemplate AspXGridView - PullRequest
3 голосов
/ 25 ноября 2011

Это очень просто, и я чувствую себя идиотом: (

Я недавно начал использовать DevX Controls. Его документация и примеры проектов - отстой!

Моя проблема:

У меня есть ASPxGridView на моей странице aspx:

<dx:ASPxGridView ID="dxdgMyGrid" runat="server" AutoGenerateColumns="False" OnStartRowEditing="DxGridStartRowEditing">
<SettingsEditing Mode="PopupEditForm" PopupEditFormHeight="200px" PopupEditFormWidth="500px"
    EditFormColumnCount="2" PopupEditFormHorizontalAlign="Center" PopupEditFormVerticalAlign="Middle"
    PopupEditFormModal="true" />
<Columns>
    <dx:GridViewDataTextColumn FieldName="MyField1" VisibleIndex="1">
        <EditFormSettings VisibleIndex="0" />
        <EditItemTemplate>
            <dx:ASPxDateEdit ID="dxdateMyField1" runat="server">
            </dx:ASPxDateEdit>
        </EditItemTemplate>
    </dx:GridViewDataTextColumn>
    <dx:GridViewDataColumn FieldName="MyField2" VisibleIndex="4">
        <EditFormSettings VisibleIndex="1" />
        <EditItemTemplate>
            <dx:ASPxComboBox ID="dxcomboMyField2" runat="server">
            </dx:ASPxComboBox>
        </EditItemTemplate>
    </dx:GridViewDataColumn>
</Columns>

Как мне связаться с dxdateMyField1 или dxcomboMyfield2 в файле ASPX.CS? Я хочу написать:

dxcomboMyField2.DataSource = GetMyData2List();
dxcomboMyField2.SelectedItemIndex = 0;
... etc.

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 25 ноября 2011

Вы не можете получить доступ к элементу управления EditItemTemplate напрямую.Вы можете получить к ним доступ в событии HtmlRowCreated как:

if (e.RowType != GridViewRowType.InlineEdit) return;
    ASPxTextBox txtBox = ASPxGridView1.FindEditRowCellTemplateControl(ASPxGridView1.Columns["Name"]
            as GridViewDataColumn, "ASPxTextBox1") as ASPxTextBox;

Проверьте документацию о доступе к элементам управления, содержащимся в шаблонах

Можно привести свойство ASPxLabel.NamingContainerв GridViewEditItemTemplateContainer и получить значение столбца через свойство GridViewEditItemTemplateContainer.Text.

Но мне нравится technique of using the Init/Load event handler. Когда сетка переключается в режим редактирования, возникает событие ASPxLabel.Load.Прочтите эту статью Общая методика использования обработчика события Init / Load для помощи в реализации.

[ASPx]

<dxe:ASPxTextBox ID="txtName" runat="server" Width="170px" OnInit="txtName_Init">

</dxe:ASPxTextBox>

[C #]

ASPxTextBox txtName;    

protected void txtName_Init(object sender, EventArgs e)    
{    
    txtName = (ASPxTextBox)sender;

    GridViewEditFormTemplateContainer container = txtName.NamingContainer as GridViewEditFormTemplateContainer;
// You can remove the if statement, and try to insert a new record. You'll catch an exception, because the DataBinder returns null reference

    if (!container.Grid.IsNewRowEditing)

        txtName.Text = DataBinder.Eval(container.DataItem, "CategoryName").ToString();    
} 

Событие обновления:

protected void grid_RowUpdating(object sender, DevExpress.Web.Data.ASPxDataUpdatingEventArgs e)
{
    e.NewValues["CategoryName"] = txtName.Text;
} 

Уже есть вопрос - ASPxGridView - Как найти элемент управления внутри EditItemTemplate на DevExpress Fourm.

1 голос
/ 25 ноября 2011

Вы можете использовать комбинированный обработчик события init / load для настройки комбинированного источника данных. Если это не работает для вас, используйте FindEditRowCellTemplateControl (используйте ссылку в комментариях для дальнейшего объяснения).

...