Пейджинг ObjectDataSource - PullRequest
       24

Пейджинг ObjectDataSource

0 голосов
/ 27 апреля 2010

Код моей страницы ASP:

  <asp:ObjectDataSource runat="server" ID="odsResults" OnSelecting="odsResults_Selecting" />
    <tr><td>
    <wssawc:SPGridViewPager ID="sgvpPagerTop" runat="server" GridViewId="sgvConversionResults" />
    </td></tr>
    <tr>
        <td colspan="2" class="ms-vb">
            <wssawc:SPGridView 
                runat="server" 
                ID="sgvConversionResults" 
                AutoGenerateColumns="false"
                RowStyle-CssClass=""
                AlternatingRowStyle-CssClass="ms-alternating" 
                />
        </td>
    </tr>

Код класса:

public partial class Convert : System.Web.UI.Page

{
   ...
   private  DataTable resultDataSource = new DataTable();
   ...

  protected void Page_Init(object sender, EventArgs e)
    {
        ...

        resultDataSource.Columns.Add("Column1");
        resultDataSource.Columns.Add("Column2");
        resultDataSource.Columns.Add("Column3");
        resultDataSource.Columns.Add("Column4");
        ...
        odsResults.TypeName = GetType().AssemblyQualifiedName;
        odsResults.SelectMethod = "SelectData";
        odsResults.SelectCountMethod = "GetRecordCount";
        odsResults.EnablePaging = true;
        sgvConversionResults.DataSourceID = odsResults.ID;
        ConversionResultsCreateColumns();
        sgvConversionResults.AllowPaging = true;
        ...
    }

    protected void btnBTN_Click(object sender, EventArgs e)
    {
        // add rows into resultDataSource
    }

    public DataTable SelectData(DataTable ds,int startRowIndex,int maximumRows)
    {
        DataTable dt = new DataTable();

        dt.Columns.Add("Column1");
        dt.Columns.Add("Column2");
        dt.Columns.Add("Column3");
        dt.Columns.Add("Column4");

        for (int i =startRowIndex; i<startRowIndex+10 ;i++)
        {   
            if (i<ds.Rows.Count)
            {
                dt.Rows.Add(ds.Rows[i][0].ToString(), ds.Rows[i][1].ToString(),
                ds.Rows[i][2].ToString(), ds.Rows[i][3].ToString());
            }
        }
        return dt;
    }

    public int GetRecordCount(DataTable ds)
    {
        return ds.Rows.Count;
    }

    protected void odsResults_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
    {
        e.InputParameters["ds"] = resultDataSource;

    }

}

При нажатии на кнопку resultDataSource получает несколько строк. Перезагрузка страницы и мы видим результат в sgvConversionResults. Первые 10 рядов. Но после нажатия на следующую страницу в пейджере у нас появляется сообщение «Нет элементов для отображения в этом представлении». При попытке отладки я обнаружил, что после страницы postBack (при нажатии на следующую страницу) входные параметры "ds" пустые, ds.Rows.Count = 0 и т. Д. ... Как будто resultDataSource стал пустым (( Что я сделал неправильно?


onPostBack все переменные получают значения по умолчанию, sgvConversionResults сохраняет свою структуру, но имеет чистые строки. Как я могу сохранить данные sgvConversionResults на событиеPostBack ???

Ответы [ 2 ]

1 голос
/ 28 апреля 2010

Я передаю resultDataSource с ViewState и эта работа удалась!

1 голос
/ 27 апреля 2010

Возможно, попробуйте:

protected void Page_Load(object sender, EventArgs e)
{
    sgvConversionResults.DataBind();
}

Ваш код кажется немного запутанным, хотя, по какой-то конкретной причине вы используете ObjectDataSource?Потому что вы можете привязать данные напрямую к сетке в коде

...