2011-07-13 75 views
0

我現在使用AJAX來更新我的GridView,當我在GridView中搜索一個文本字符串時,或者當我從下拉列表中選擇我想要訂購Gridview的時候。這在以前工作,但我真的很混亂的代碼。所以我已經清理了一下,添加了一些參數等等。不幸的是,現在,當下拉列表的選定索引更改或有人試圖搜索字段時,什麼都不會發生 - 頁面只會刷新。我還收到一個異常,說「由ORDER BY編號1標識的SELECT項包含一個變量作爲標識列位置的表達式的一部分,變量只有在引用列名的表達式進行排序時才允許」。GridView不反映AJAX的變化

如果您需要查看更多代碼,請讓我知道!

public vieworders() 
    { 
     this.PreInit += new EventHandler(vieworders_PreInit); 
    } 

    void vieworders_PreInit(object sender, EventArgs e) 
    { 
      orderByString = orderByList.SelectedItem.Value; 
      fieldString = searchTextBox.Text; 
      updateDatabase(fieldString, orderByString); 

    } 

    protected void updateDatabase(string _searchString, string _orderByString) 
    { 
     string updateCommand = "SELECT fName,lName,zip,email,cwaSource,price,length FROM SecureOrders WHERE fName LIKE @searchString OR lName LIKE @searchString OR zip LIKE @searchString OR email LIKE @searchString OR cwaSource LIKE @searchString OR length LIKE @searchString OR price LIKE @searchString ORDER BY @orderByString"; 

     Configuration rootWebConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/Cabot3"); 
     ConnectionStringSettings connectionString = rootWebConfig.ConnectionStrings.ConnectionStrings["secureodb"]; 

     // Create an SqlConnection to the database. 
     using (SqlConnection connection = new SqlConnection(connectionString.ToString())) 
     using (SqlCommand _fillDatabase = new SqlCommand(updateCommand, connection)) 
     { 

      connection.Open(); 
      _fillDatabase.Parameters.Add("@searchString", SqlDbType.VarChar, 50).Value = _searchString; 
      _fillDatabase.Parameters.Add("@orderByString", SqlDbType.VarChar, 50).Value = _orderByString; 
      _fillDatabase.ExecuteNonQuery(); 

      dataAdapter = new SqlDataAdapter("SELECT * FROM SecureOrders", connection); 

      // create the DataSet 
      dataSet = new DataSet(); 
      // fill the DataSet using our DataAdapter    
      dataAdapter.Fill(dataSet, "SecureOrders"); 

      DataView source = new DataView(dataSet.Tables[0]); 
      DefaultGrid.DataSource = source; 
      DefaultGrid.DataBind(); 
      connection.Close(); 
     } 
    } 

形式

<form id="form1" runat="server"> 
<asp:ScriptManager ID = "ScriptManager" runat="server" /> 
    <div> 
     <asp:Label runat="server" id = "orderByLabel" Text = "Order By: " /> 


     <asp:DropDownList runat="server" ID="orderByList" AutoPostBack="true"> 
      <asp:ListItem Value="fName" Selected="True">First Name</asp:ListItem> 
      <asp:ListItem Value="lName">Last Name</asp:ListItem> 
      <asp:ListItem Value="state">State</asp:ListItem> 
      <asp:ListItem Value="zip">Zip Code</asp:ListItem> 
      <asp:ListItem Value="cwaSource">Source</asp:ListItem> 
      <asp:ListItem Value="cwaJoined">Date Joined</asp:ListItem> 
     </asp:DropDownList> 
    </div> 
    <div> 
     <asp:Label runat="server" ID="searchLabel" Text="Search For: " /> 
     <asp:TextBox ID="searchTextBox" runat="server" Columns="30" /> 
     <asp:Button ID="searchButton" runat="server" Text="Search" /> 
    </div> 
<div> 
<asp:UpdatePanel ID = "up" runat="server"> 



    <ContentTemplate> 
    <div style= "overflow:auto; height:50%; width:100%"> 
    <asp:GridView ID="DefaultGrid" runat = "server" DataKeyNames = "IdentityColumn" 
    onselectedindexchanged = "DefaultGrid_SelectedIndexChanged" 
    autogenerateselectbutton = "true"> 
    <SelectedRowStyle BackColor="Azure" 
    forecolor="Black" 
    font-bold="true" /> 
    <Columns> 
    <asp:TemplateField HeaderText="Processed"> 
       <ItemTemplate> 
        <asp:CheckBox ID="CheckBoxProcess" AutoPostBack = "true" Checked ='<%#Eval("processed") %>' OnCheckedChanged="CheckBoxProcess_CheckedChanged" runat="server" Enabled="true" /> 
       </ItemTemplate> 
      </asp:TemplateField> 
    </Columns> 
    </asp:GridView> 
    </div> 
    </div> 
    <div style= "overflow:auto; height:50%; width:100%" /> 
    <table border="1"> 
     <tr>  
     <td>Name: </td> 
     <td><%=name %></td> 
     </tr> 
     <tr> 
     <td>Zip: </td> 
     <td><%=zip %></td> 
     </tr> 
     <tr> 
     <td>Email: </td> 
     <td><%=email %></td> 
     </tr> 
     <tr> 
     <td>Length: </td> 
     <td><%=length %></td> 
     </tr> 
     <tr> 
     <td>Price: </td> 
     <td><%=price %></td> 
     </tr> 
     <tr> 
     <td>Source: </td> 
     <td><%=source %></td> 
     </tr> 
    </table> 
    </div> 
    </ContentTemplate> 
    </asp:UpdatePanel> 



</div> 
</form> 
+0

請顯示您的表單設計? –

+0

新增了它!完成了! –

回答

0

自從我的公司使用Telerik以來,我從來沒有使用UpdatePanel,但是從我在研究中看到的例子中我看到有一個觸發器組件。

從我的理解,如果控制是w /我的UpdatePanel本身,那麼你不必指定觸發器,因爲它是假設的。

對於您的場景,觸發器(dropdownlist)在UpdatePanel之外。您可能需要在您的aspx中包含此項:

<asp:UpdatePanel ID = "up" runat="server"> 
<Triggers> 
    <asp:AsyncPostBackTrigger ControlID="orderByList" > 
</Triggers> 
<ContentTemplate> 
    ... 
+0

謝謝,我在某個時候確實有觸發器,但後來我擺脫了它。我會再試一次,看看會發生什麼:D –

0

嘗試以下操作:

  1. 在HTML中移動的ScriptManager行之後更新面板直接。
  2. 將vieworders_PreInit中的代碼行移動到vieworders_PageLoad以!IsPostPack子句。
+0

對不起,這並沒有改變任何東西! –