2011-06-15 54 views
0

我有一個ASPxComboBox,我能夠正確過濾用戶輸入。現在我想將選定的項目保存到數據庫。但是當我嘗試獲取SelectedItem時,它是空的。DevExpress ASPxComboBox SelectItem爲空

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爲空。任何人有一個想法爲什麼?

回答

0

我知道這個問題是舊的,但萬一有人正在通過它看。以下是其他可能的解決方案:

  1. 確保ValueType與您的表格匹配實際的「值」類型。某些值類型不會自動填充,如「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的方法,你只需調用該方法,而不是每次重複該代碼