Проблемы с gridview - PullRequest
       29

Проблемы с gridview

1 голос
/ 18 января 2011

Я создал gridview с фильтром и все хорошо, но когда я делаю gridview.databind ();ничего не происходит, и с изменением индекса страницы тоже ничего не происходит.

Я использовал scriptmanger, updatepanel и немного кода разметки JavaScript:

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"/>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
<asp:GridView ID="GridView1" ClientIDMode="Static" runat="server" AllowPaging="True" AutoGenerateColumns="False"
    onload="GridView1_Load" OnRowCreated="OnRowCreated" Width="614px" CellPadding="4" ForeColor="#333333" 
    GridLines="Both" EmptyDataText="No Data To Show">
    <Columns>
        <asp:BoundField DataField="areacode" HeaderText="areacode" 
            SortExpression="areacode" />
        <asp:BoundField DataField="areaename" HeaderText="areaename" 
            SortExpression="areaename" />
        <asp:BoundField DataField="areaaname" HeaderText="areaaname" 
            SortExpression="areaaname" />
        <asp:BoundField DataField="areazipcode" HeaderText="areazipcode" 
            SortExpression="areazipcode" />
        <asp:BoundField DataField="districtcode" HeaderText="districtcode" 
            SortExpression="districtcode" />
    </Columns>
    <EditRowStyle BackColor="#999999" />
    <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
    <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White"/>
    <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
    <RowStyle BackColor="#ffffff" ForeColor="#333333" />
</asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>


<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:NetCareConnectionString %>" 
    SelectCommand="SELECT * FROM [areadata]"></asp:SqlDataSource>


<script language="javascript" type="text/javascript">
    var gridViewCtlId = '<%=GridView1.ClientID%>';
    var gridViewCtl = null;
    var curSelRow = null;

    function onchange(evt) {
        PageMethods.getControlData(evt.target.id, document.getElementById(evt.target.id).value);
    }
    function getGridViewControl() {
        if (null == gridViewCtl) {
            gridViewCtl = document.getElementById(gridViewCtlId);
        }
    }

    function onGridViewRowSelected(rowIdx, isfiltered) {
        var selRow;
        //filter one
        if (rowIdx == '1' & isfiltered == 'True')
            selRow = null;
        else
            selRow = getSelectedRow(rowIdx);

        if (curSelRow != null) {
            curSelRow.style.backgroundColor = '#ffffff';
        }

        if (selRow != null) {
            curSelRow = selRow;
            curSelRow.style.backgroundColor = '#8098B3';
        }




    }

    function getSelectedRow(rowIdx) {
        getGridViewControl();
        PageMethods.getRowSelected(rowIdx - 1);
        if (null != gridViewCtl) {
            return gridViewCtl.rows[rowIdx];
        }
        return null;
    }

код:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

public partial class _Default : System.Web.UI.Page
{
    static string controlID, controlValue, selectedRowIndex;
    #region WebMethods
    [System.Web.Services.WebMethod]
    public static void getControlData(string controlIDP, string controlValueP)
    {
        controlID = controlIDP;
        controlValue = controlValueP;
        _Default d = new _Default();
        d.textboxes_TextChanged();
    }
    [System.Web.Services.WebMethod]
    public static void getRowSelected(string rowIndex)
    {
        selectedRowIndex = rowIndex;
    }
    #endregion    
    private void SetInitialRow(GridView inputGridView,SqlDataSource inputSqlDataSource)
    {
        if (inputGridView != null)
        {
            DataView dv = (DataView)inputSqlDataSource.Select(DataSourceSelectArguments.Empty);
            object [] session=new object[2];
            session[0]=dv;
            session[1] = inputGridView;
            Session["GridView"] = session;
            TextBox[] tb = new TextBox[inputGridView.Columns.Count];
            DataTable dt = dv.Table.Clone();
            dt.Rows.Add(dt.NewRow());
            for (int row = 0; row < dv.Table.Rows.Count; row++)
            {
                DataRow newRow = dt.NewRow();
                newRow = dv.Table.Rows[row];
                dt.ImportRow(newRow);
            }
            inputGridView.DataSource = dt;
            inputGridView.DataBind();
            for (int i = 0; i < inputGridView.Columns.Count; i++)
            {
                tb[i] = new TextBox();
                tb[i].Attributes.Add("id", i.ToString());
                if (!inputGridView.Rows[0].Cells[i].HasControls())
                    inputGridView.Rows[0].Cells[i].Controls.Add(tb[i]);
                else
                    inputGridView.Rows[0].Cells[i].Controls.Clear();
            }
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        SetInitialRow(GridView1, SqlDataSource1);  
    }
    public void textboxes_TextChanged()
    {
        if (!string.IsNullOrWhiteSpace(controlValue))
        {
            object[] session = (object[])Session["GridView"];
            DataView dv = (DataView)session[0];
            GridView1 = (GridView)session[1];
            String strexpr = string.Format("{0}={1}", dv.Table.Columns[int.Parse(controlID)], controlValue);
            DataRow[] rows = dv.Table.Select(strexpr);
            DataTable dt = dv.Table.Clone();
            foreach (DataRow row in rows)
                dt.ImportRow(row);
            System.Windows.Forms.MessageBox.Show(dt.Rows.Count.ToString());
            GridView1.DataSource = dt;
            GridView1.DataBind();
        }
    }
    protected void OnRowCreated(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            e.Row.Attributes.Add("onclick", "onGridViewRowSelected('" + (e.Row.RowIndex + 1).ToString() + "','" + true + "')");
        }
    }   
    protected void GridView1_Load(object sender, EventArgs e)
    {

    }
}

Ответы [ 2 ]

0 голосов
/ 18 января 2011

Я не уверен, какая DataBind () вызывает у вас проблемы.

При выполнении:

    protected void Page_Load(object sender, EventArgs e)     
{
         SetInitialRow(GridView1, SqlDataSource1);       
} 

Вы передаете GridView1 по значению, поэтому, когда вы привязываетесь к нему в функции SetInitialValue, то есть привязываете к копии, а НЕ к сетке в WebForm. Вы можете попробовать передать GridView1 по ссылке. То же самое относится и к SqlDataSource1.

Редактировать См. ref (C # Reference) , чтобы узнать больше о ключевом слове ref в c #. Если передать по ссылке, ваш код будет выглядеть примерно так:

   protected void Page_Load(object sender, EventArgs e)     
{
         SetInitialRow(ref GridView1, ref SqlDataSource1);       
} 

и

private void SetInitialRow(ref GridView inputGridView,ref SqlDataSource inputSqlDataSource)     
{ 
0 голосов
/ 18 января 2011

Установите точки останова в вашем коде в строках DataBind ().Когда он попадает в строку, проверьте связанный DataTable и убедитесь, что он содержит информацию.Симптомы, которые вы испытываете, указывают на то, что фильтр не приводит к доставке данных в Грид.Если я прав, это не удивительно, что вы ничего не видите.Я был бы удивлен, если у вас есть данные непосредственно перед привязкой.

Следующий шаг - определить, есть ли у вас данные изначально.

Еще один вариант, о котором я могу подумать, это вы делаетеначальная привязка, но не повторная привязка после изменения значений (повторная отправка и т. д.).Если это так, вам нужно настроить «кеш» для хранения таблицы, а затем отфильтровать при необходимости.Либо так, либо совершите обратную поездку в базу данных.

...