1

グリッドビューで更新レートを分離するにはどうすればよいですか?データのフィルタリングにドロップダウンリストを使用しています。何も選択されていない場合は、すべてが表示されます。たとえば、国でフィルタリングしているので、gridviewで国ごとに異なる更新レートを使用したいと思います。

<form id="form1" runat="server">

  <h3>Northwind Employees</h3>

    <table cellspacing="10">            
      <tr>
        <td valign="top">
          <table border="0">
            <tr>
              <td valign="top">Country</td>
              <td><asp:DropDownList runat="server" id="CountryListBox" AppendDataBoundItems="True"
                                    DataSourceID="CountrySqlDataSource" 
                                    DataTextField="Country" DataValueField="Country" >
                    <asp:ListItem Selected="True" Value="" >(Show All)</asp:ListItem>
                  </asp:DropDownList>
              </td>
            </tr>
            <tr>
              <td>Last Name</td>
              <td><asp:TextBox runat="server" id="LastNameTextBox" Text="*" /></td>
            </tr>
            <tr>
              <td></td>
              <td><asp:Button runat="server" id="FilterButton" Text="Filter Results" /></td>
            </tr>
          </table>
        </td>

        <td valign="top">                
          <asp:GridView ID="EmployeesGridView"
            DataSourceID="EmployeeDetailsSqlDataSource"
            AutoGenerateColumns="false"
            AllowSorting="true"
            DataKeyNames="EmployeeID"     
            Gridlines="Both"
            RunAt="server">

            <HeaderStyle backcolor="Navy"
              forecolor="White"/>

            <RowStyle backcolor="White"/>

            <AlternatingRowStyle backcolor="LightGray"/>

            <EditRowStyle backcolor="LightCyan"/>

            <Columns>                  
              <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" ReadOnly="true"/>                    
              <asp:BoundField DataField="FirstName"  HeaderText="First Name"/>
              <asp:BoundField DataField="LastName"   HeaderText="Last Name"/>                    
              <asp:BoundField DataField="Country"    HeaderText="Country"/>                    
            </Columns>                 
          </asp:GridView>
        </td>                
      </tr>            
    </table>

    <asp:SqlDataSource ID="CountrySqlDataSource" 
      SelectCommand="SELECT DISTINCT Country FROM Employees"
      EnableCaching="True"
      CacheDuration="60"
      ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
      RunAt="server" />

    <asp:SqlDataSource ID="EmployeeDetailsSqlDataSource" 
      SelectCommand="SELECT EmployeeID, LastName, FirstName, Country FROM Employees"
      EnableCaching="True"
      CacheDuration="60"
      ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
      FilterExpression="Country LIKE '{0}' AND LastName LIKE '{1}'"
      RunAt="server">

      <FilterParameters>
        <asp:ControlParameter ControlID="CountryListBox"   PropertyName="SelectedValue" />
        <asp:ControlParameter ControlID="LastNameTextBox" PropertyName="Text" />
      </FilterParameters>
    </asp:SqlDataSource>
  </form>
4

1 に答える 1

2

ええと、データを部分的にレンダリングできるとは思いませんが、とコントロールをGridView使って実験を行ったところ、うまく機能し、グリッドデータが更新され、サーバーでページングしているので、ほんの少しのデータです。 SQLServerから取得されます。UpdatePanelTimer

良い点は、データが更新されても現在のページのインデックスと順序が保持されるため、グリッドデータが部分的に更新されているように見えることです。

見てください:

ASPX

    <asp:ScriptManager runat="server" />
    <asp:ObjectDataSource runat="server" ID="ods" TypeName="MyObject" EnablePaging="True"
        SelectMethod="FindPaging"
        MaximumRowsParameterName="pageSize"
        SortParameterName="sortColumn"
        StartRowIndexParameterName="startIndex"
        SelectCountMethod="FindPagingCount"
    >
        <SelectParameters>
            <asp:Parameter Name="sortColumn" Type="String" />
            <asp:Parameter Name="startIndex" Type="Int32" />
            <asp:Parameter Name="pageSize" Type="Int32" />
            <asp:ControlParameter Name="job" Type="String" ControlID="ddl" />
        </SelectParameters>
    </asp:ObjectDataSource>

    <asp:DropDownList AutoPostBack="true" runat="server" ID="ddl" DataTextField="job_desc" DataValueField="job_id">
    </asp:DropDownList>

    <asp:UpdatePanel runat="server">
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="ddl" EventName="SelectedIndexChanged" />
        </Triggers>
        <ContentTemplate>
            <asp:GridView ID="grid" runat="server" AllowPaging="True" AllowSorting="True" PageSize="10"
                DataSourceID="ods" AutoGenerateColumns="true">
            </asp:GridView>
            <asp:Label runat="server" ID="lblMessage"></asp:Label>
            <asp:Timer Enabled="true" Interval="5000" runat="server" ID="timer" OnTick="timer_Tick"></asp:Timer>
        </ContentTemplate>
    </asp:UpdatePanel>

背後にあるASPXコードで

protected void Page_Load(object sender, EventArgs e)
{
    if (!this.IsPostBack)
    {
        this.ddl.DataSource = new DataClassesDataContext().jobs;
        this.ddl.DataBind();
    }
}

protected void timer_Tick(object sender, EventArgs e)
{
    this.grid.DataBind();
}

データオブジェクト

public class MyObject
{
    public IEnumerable<employee> FindPaging(string job, int startIndex, int pageSize, string sortColumn)
    {
        var c = new DataClassesDataContext();
        var sort = string.Empty;

        if (string.IsNullOrWhiteSpace(sortColumn) || sortColumn == "sortColumn")
        {
            sort = "fname";
        }
        else
        {
            sort = sortColumn.Replace("sortColumn ", string.Empty);
            sort = sort.Replace(" DESC", string.Empty);
        }

        var q = c.employees.Where(x => x.job_id.ToString() == job).Skip(startIndex).Take(pageSize);

        if (!sortColumn.Contains("DESC"))
        {
            return q.OrderBy(sort);
        }
        else
        {
            return q.OrderByDescending(sort);
        }
    }

    public int FindPagingCount(string job, int startIndex, int pageSize, string sortColumn)
    {
        var c = new DataClassesDataContext();

        return c.employees.Where(x => x.job_id.ToString() == job).Count();
    }
}
于 2012-07-16T07:55:06.410 に答える