2011-06-10 77 views
0

我有一個DevExpress套件中的ASPxComboBox,並試圖讓它過濾。如果我點擊組合框的下拉按鈕,它將顯示查詢的前幾個,就像過濾器是空的一樣。DevExpress ASPxComboBox沒有過濾

如果我嘗試填充的過濾器,或向下滾動看到更多的,它只是提供一個永久的「加載」狀態。存儲過程在使用適當的參數運行時返回正確的結果。可能是什麼問題呢?

編輯:我一直跟着本教程在DevExpress的網站:http://demos.devexpress.com/ASPxEditorsDemos/ASPxComboBox/LargeDataSource.aspx

EDIT(再次):OK,如果我刪除行:從下拉列表框

<ClientSideEvents BeginCallback="function(s, e) { OnBeginCallback(); }" EndCallback="function(s, e) { OnEndCallback(); } " /> 

將創下破在cboInstructor_OnItemsRequestedByFilterCondition_SQL點,但要到DataBind()將投擲攻擊的錯誤:

Index (zero based) must be greater than or equal to zero and less than the size of the argument list.

ASP文件

<form id="form1" runat="server"> 
<div> 
    <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="{1} {2}" 
     DropDownStyle="DropDown" DataSourceID="SqlDataSourceInstruct" 
    > 
     <Columns> 
      <dxe:ListBoxColumn FieldName="display_forename" /> 
      <dxe:ListBoxColumn FieldName="display_surname" /> 
     </Columns> 
     <ClientSideEvents BeginCallback="function(s, e) { OnBeginCallback(); }" EndCallback="function(s, e) { OnEndCallback(); } " /> 
    </dxe:ASPxComboBox> 
    <asp:SqlDataSource ID="SqlDataSourceInstruct" runat="server" ConnectionString="Server=160.10.1.25;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> 
</div> 
</form> 

CS文件

public partial class TestComboBox : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void cboInstructor_OnItemsRequestedByFilterCondition_SQL(object source, ListEditItemsRequestedByFilterConditionEventArgs e) 
    { 
     ASPxComboBox comboBox = (ASPxComboBox)source; 
     //SqlDataSourceInstruct.SelectCommand = 
     //  @"SELECT CONCAT(display_Forename, ' ', display_Surname) FROM (SELECT employee_id, display_forename , display_surname, @rownum:[email protected]+1 AS rn FROM central.user_record, (SELECT @rownum:=0) AS r WHERE CONCAT(display_forename, ' ', display_surname) LIKE @filter ORDER BY display_surname ASC) AS st where st.rn between @startIndex and @endIndex"; 

     SqlDataSourceInstruct.SelectParameters.Clear(); 
     SqlDataSourceInstruct.SelectParameters.Add("filter", TypeCode.String, string.Format("%{0}%", e.Filter)); 
     SqlDataSourceInstruct.SelectParameters.Add("startIndex", TypeCode.Int64, (e.BeginIndex + 1).ToString()); 
     SqlDataSourceInstruct.SelectParameters.Add("endIndex", TypeCode.Int64, (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; 
     SqlDataSourceInstruct.SelectCommand = @"SELECT employee_id, display_surname, display_forename FROM central.user_record WHERE (employee_id = @ID) ORDER BY display_forename"; 

     SqlDataSourceInstruct.SelectParameters.Clear(); 
     SqlDataSourceInstruct.SelectParameters.Add("ID", TypeCode.Int64, e.Value.ToString()); 
     comboBox.DataSource = SqlDataSourceInstruct; 
     comboBox.DataBind(); 

    } 
} 

MySQL存儲過程

DELIMITER $$ 

USE `central`$$ 

DROP PROCEDURE IF EXISTS `GetUser`$$ 

CREATE DEFINER=`root`@`%` PROCEDURE `GetUser`(filter VARCHAR(50), startIndex INT, endIndex INT) 
BEGIN 
    SELECT employee_id, display_Forename, display_Surname 
    FROM 
     (SELECT 
      employee_id 
      , display_forename 
      , display_surname 
      , @rownum:[email protected]+1 AS rn 
     FROM central.user_record, 
      (SELECT @rownum:=0) AS r 
     WHERE CONCAT(display_forename, ' ', display_surname) LIKE filter 
     ORDER BY display_surname ASC) AS st 
    WHERE st.rn BETWEEN startIndex AND endIndex; 
    END$$ 

DELIMITER ; 
+0

好從加入更多的事情我已經嘗試了更多的信息。 – anothershrubery 2011-06-10 13:38:59

回答

1

爲什麼這些事情總是如此簡單?我曾在ASPxComboBoxTextFormatString="{1} {2}"而且只有2列,我還有第三個之前,但刪除了,忘了改變TextFormatString我也只是刪除了ClientSideEvents因爲他們從我上面貼的例子,但我不使用它們。

現在一切正常!

+0

+1感謝一大堆...我同樣的問題....我以前使用的是這樣的:「TextFormatString = 「{」 + this.dtbl.Columns.IndexOf(COL0)+ 「} - {」 +這.dtbl.Columns.IndexOf(COL1)+「}」,」 但後來我刪除從我的數據源的一些列,以便它不工作了。 – Soenhay 2012-10-05 19:14:08