1

ユーザー入力で正しくフィルタリングできる ASPxComboBox があります。選択したアイテムをデータベースに保存したいと思います。しかし、SelectedItem を取得しようとすると、null になります。

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無効です。誰でも理由がわかりますか?

4

2 に答える 2

1

この質問が古いことは知っていますが、誰かがそれを見ている場合に備えて。他に考えられる解決策は次のとおりです。

  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 をリロードするメソッドがあり、このコードを毎回繰り返すのではなく、そのメソッドを呼び出すだけです。

于 2015-08-13T07:57:38.977 に答える
1

アンソニー、

SelectedItem は、選択する項目を指定するために使用されます。ASPxComboBox で項目を選択すると、Value プロパティまたは Text プロパティを使用して参照できます。

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

このスレッドも役立つかもしれません: http://community.devexpress.com/forums/t/61424.aspx

ありがとう。

于 2011-07-27T01:06:49.900 に答える