DevExpress ASPxComboBox SelectItem является нулевым - PullRequest
1 голос
/ 15 июня 2011

У меня есть ASPxComboBox, который я смог правильно фильтровать при вводе пользователем. Теперь я хочу сохранить выбранный элемент в базе данных. Но когда я пытаюсь получить SelectedItem, это ноль.

ASP

<dxe:ASPxComboBox ID="cboInstructor" runat="server" Width="100%"
            EnableCallbackMode="True" CallbackPageSize="10"
            IncrementalFilteringMode="Contains" ValueType="System.Int32" ValueField="employee_id"
            OnItemsRequestedByFilterCondition="cboInstructor_OnItemsRequestedByFilterCondition_SQL"
            OnItemRequestedByValue="cboInstructor_OnItemRequestedByValue_SQL" TextFormatString="{0} {1}"
            DropDownStyle="DropDown"
        >
            <Columns>
                <dxe:ListBoxColumn FieldName="display_forename" Caption="Forename" />
                <dxe:ListBoxColumn FieldName="display_surname" Caption="Surname" />
            </Columns>
        </dxe:ASPxComboBox>

        <asp:SqlDataSource ID="SqlDataSourceInstruct" runat="server" ConnectionString="Server=testserver;User ID=root;Password=password;Persist Security Info=True;Database=central" ProviderName="MySql.Data.MySqlClient" SelectCommand="GetUser" SelectCommandType="StoredProcedure">
            <SelectParameters>
                <asp:Parameter Name="filter" Type="String" />
                <asp:Parameter Name="startIndex" Type="Int32" />
                <asp:Parameter Name="endIndex" Type="Int32" />
            </SelectParameters>
        </asp:SqlDataSource>
        <asp:SqlDataSource ID="SqlDataSourceInstructPopulate" runat="server" ConnectionString="Server=testserver;User ID=root;Password=password;Persist Security Info=True;Database=central" ProviderName="MySql.Data.MySqlClient" SelectCommand="GetUser" SelectCommandType="StoredProcedure">
        </asp:SqlDataSource>

        <asp:Button ID="btnTest" runat="server" Text="Test" OnClick="btnTest_Click" />

CS

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void cboInstructor_OnItemsRequestedByFilterCondition_SQL(object source, ListEditItemsRequestedByFilterConditionEventArgs e)
    {
        ASPxComboBox comboBox = (ASPxComboBox)source;

        SqlDataSourceInstruct.SelectParameters.Clear();
        SqlDataSourceInstruct.SelectParameters.Add("filter", TypeCode.String, string.Format("%{0}%", e.Filter));
        SqlDataSourceInstruct.SelectParameters.Add("startIndex", TypeCode.Int32, (e.BeginIndex + 1).ToString());
        SqlDataSourceInstruct.SelectParameters.Add("endIndex", TypeCode.Int32, (e.EndIndex + 1).ToString());
        comboBox.DataSource = SqlDataSourceInstruct;
        comboBox.DataBind();
    }

    protected void cboInstructor_OnItemRequestedByValue_SQL(object source, ListEditItemRequestedByValueEventArgs e)
    {
        long value = 0;
        if (e.Value == null)
            return;
        if (!Int64.TryParse(e.Value.ToString(), out value))
            return;
        ASPxComboBox comboBox = (ASPxComboBox)source;
        SqlDataSourceInstructPopulate.SelectCommand = @"SELECT employee_id, display_surname, display_forename FROM user_record WHERE employee_id = @ID ORDER BY display_forename";
        SqlDataSourceInstructPopulate.SelectCommandType = System.Web.UI.WebControls.SqlDataSourceCommandType.Text;
        SqlDataSourceInstructPopulate.SelectParameters.Clear();
        SqlDataSourceInstructPopulate.SelectParameters.Add("ID", TypeCode.Int64, e.Value.ToString());
        comboBox.DataSource = SqlDataSourceInstructPopulate;
        comboBox.DataBind();
        comboBox.ValueField = "employee_id";
    }

    protected void btnTest_Click(object sender, EventArgs e)
    {
        int iTest = (int)cboInstructor.SelectedItem.GetValue("employee_id");
    }

На линии:

int iTest = (int)cboInstructor.SelectedItem.GetValue("employee_id");

cboInstructor.SelectedItem равно нулю. У кого-нибудь есть идеи, почему?

Ответы [ 2 ]

1 голос
/ 27 июля 2011

Энтони,

SelectedItem используется для указания элемента для выбора.После выбора элемента в ASPxComboBox вы можете использовать свойство Value или Text для ссылки на него.

http://documentation.devexpress.com/#AspNet/DevExpressWebASPxEditorsASPxComboBoxMembersTopicAll

Эта тема также может помочь вам: http://community.devexpress.com/forums/t/61424.aspx

Спасибо.

0 голосов
/ 13 августа 2015

Я знаю, что этот вопрос старый, но если кто-то просматривает его.Вот другие возможные решения:

  1. Убедитесь, что ValueType соответствует фактическому типу 'Value' согласно вашей таблице.Некоторые типы значений не заполняются автоматически, например «System.Guid».Но они доступны.По сути, DevExpress будет использовать любой тип значений, который использует ваша таблица, даже если он не указан в списке, если вы введете его вручную, он его подберет.

  2. По своей структуре ASPxComboBox не синхронизируетсяна стороне сервера.Чтобы это исправить, всегда связывайте свой ASPxComboBox при каждом запросе страницы.Таким образом, загрузка страницы должна выглядеть следующим образом:

    protected void Page_Load(object sender, EventArgs e)    
    {        
        SqlDataSourceInstruct.SelectParameters.Clear();
        SqlDataSourceInstruct.SelectParameters.Add("filter",TypeCode.String, string.Format("%{0}%", e.Filter));
        SqlDataSourceInstruct.SelectParameters.Add("startIndex", TypeCode.Int32, (e.BeginIndex + 1).ToString());
        SqlDataSourceInstruct.SelectParameters.Add("endIndex", TypeCode.Int32, (e.EndIndex + 1).ToString());
        cboInstructor.DataSource = SqlDataSourceInstruct;
        cboInstructor.DataBind();
    }
    

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

...