Заполните ASPxTextBox и ASPxListBox из кода позади - PullRequest
0 голосов
/ 13 июня 2011

Я использую Devexpress ASPxGridView для проекта, но возникают проблемы с заполнением пользовательской EditForm данными.

Это выглядит следующим образом

<Templates>
    <EditForm>
        Company Name:
        <dx:ASPxTextBox ID="CompanyName" runat="server" Value="<% #Bind('CompanyName') %>" />
        Parent:
        <dx:ASPxListBox ID="ParentGuid" runat="server" Value="<% #Bind('ParentGuid') %>" />
    </EditForm>
</Templates>

Обычно я пишу что-то вроде

protected void ASPxGridView1_StartRowEditing(object sender, DevExpress.Web.Data.ASPxStartRowEditingEventArgs e)
{
    var CompanyList = db.companies.OrderBy(x => x.CompanyName).ToList();
    ASPxListBox ParentGuid = (ASPxListBox)ASPxGridView1.FindControl("ParentGuid");
    ParentGuid.DataSource = CompanyList;
    ParentGuid.DataBind();

    ASPxTextBox CompanyName = (ASPxTextBox)ASPxGridView1.FindControl("CompanyName");
    CompanyName.Text = "Some company name";
}

Но это не сработает.Любой совет, с чего начать?Документация не очень хорошо описывает пользовательские формы: /

Спасибо!

== ОБНОВЛЕНИЕ ==

Пробовал с помощью onhtmleditformcreated = "ASPxGridView1_HtmlEditFormCreated "с методом

protected void ASPxGridView1_HtmlEditFormCreated(object sender, ASPxGridViewEditFormEventArgs e)
{
    Control CompanyName = ASPxGridView1.FindEditFormTemplateControl("CompanyName");
    if (CompanyName != null)
    {
        ASPxTextBox CompanyNameEdit = CompanyName as ASPxTextBox;
        CompanyName.Text = "Some Co";
    }

}

Тот факт, что я использую Value =" <% #Bind ('CompanyName')%> ", немного запутывает.Если я удаляю Bind, ящики заполняются, но тогда я не могу получить данные в них.Есть ли способ обойти это?

Ответы [ 2 ]

1 голос
/ 13 июня 2011

Ответ ...

Заполнение ASPxComboBox с именем CompanyList

protected void ASPxGridView1_HtmlEditFormCreated(object sender, ASPxGridViewEditFormEventArgs e)
{
    Control ParentGuidControl = ASPxGridView1.FindEditFormTemplateControl("ParentGuid");
    if (ParentGuidControl != null)
    {
        ASPxComboBox ParentGuid = (ASPxComboBox)ParentGuidControl;

        var CompanyList = db.companies.OrderBy(x => x.CompanyName);
        ParentGuid.TextField = "CompanyName";
        ParentGuid.ValueField = "CompanyGuid";
        ParentGuid.DataSource = CompanyList;
        ParentGuid.DataBind();
    }
}

НО!

Если у вас есть пользовательская форма, как у меня

<Templates>
    <EditForm>
        Company Name:
        <dx:ASPxTextBox ID="CompanyName" runat="server" Value="<% #Bind('CompanyName') %>" />
        Parent:
        <dx:ASPxComboBox ID="ParentGuid" runat="server" Value="<% #Bind('ParentGuid') %>" />
    </EditForm>
</Templates>

вы не сможете заполнить его из-за кода, метод #bind мешает и перезаписывает любое другое входящее значение. Однако, если вы не планируете заполнять их из кода, вот хитрый прием для извлечения данных ...

protected void ASPxGridView1_RowInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e)
{
    IDictionaryEnumerator enumerator = e.NewValues.GetEnumerator();

    string CompanyName = string.Empty;
    Guid ParentGuid = Guid.Empty;

    enumerator.Reset();
    while (enumerator.MoveNext())
        if (enumerator.Key.ToString() == "CompanyName")
            CompanyName = enumerator.Value.ToString();
        else if (enumerator.Key.ToString() == "ParentGuid")
            ParentGuid = new Guid(enumerator.Value.ToString());

    // Do insert trick here

}

Но если вы хотите заполнить некоторые значения формы из-за кода, убедитесь, что в EditForm нет методов #bind

<Templates>
    <EditForm>
        Company Name:
        <dx:ASPxTextBox ID="CompanyName" runat="server" />
        Parent:
        <dx:ASPxComboBox ID="ParentGuid" runat="server" />
    </EditForm>
</Templates>

Заполните, как описано в верхней части этого поста, и получите значения, подобные этим

protected void ASPxGridView1_RowInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e)
{
    string CompanyName = string.Empty;
    Guid ParentGuid = Guid.Empty;

    // This method is a bit more secure
    Control CompanyNameControl = ASPxGridView1.FindEditFormTemplateControl("CompanyName");
    if (CompanyNameControl != null)
    {
        ASPxTextBox CompanyNameTb = (ASPxTextBox)CompanyNameControl;
        CompanyName = CompanyNameTb.Text.ToString();
    }

    // A bit less secure, but lesser code
    ASPxComboBox ParentGuidControl = (ASPxComboBox)ASPxGridView1.FindEditFormTemplateControl("ParentGuid");
    ParentGuid = new Guid(ParentGuidControl.SelectedItem.Value.ToString());

    // Do insert...

}

Веселитесь

1 голос
/ 13 июня 2011

Вы должны использовать немного другой подход:

Используйте событие HtmlEditFormCreated для установки свойств редактора.Чтобы получить экземпляры редактора, используйте метод gridView FindEditFormTemplateControl .

...