Событие GridView неожиданно возникает после обратной передачи - PullRequest
1 голос
/ 30 августа 2011

Рассмотрим код страницы Asp.net:

<head runat="server">
<title></title>
<script type="text/javascript">
        function showhide(master, detail) {
            var src = $(master).children()[0].src;
            if (src.endsWith("plus.png"))
                src = src.replace('plus.png', 'minus.png');
            else
                src = src.replace('minus.png', 'plus.png');

            $(master).children()[0].src = src;

            $(detail).slideToggle("normal");
        }
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
    <Scripts>
        <asp:ScriptReference Path="~/scripts/jquery-1.6.2.min.js" ScriptMode="Release" />
    </Scripts>
</asp:ScriptManager>
<div>
<asp:SqlDataSource ID="sqlDsCustomers" runat="server" ConnectionString="<%$ ConnectionStrings:Northwind %>"
    SelectCommand="SELECT [Customers].[CustomerID], [Customers].[CompanyName], COUNT([OrderID]) TotalOrders&#13;&#10;FROM [Customers] INNER JOIN [Orders] ON [Customers].[CustomerID]=[Orders].[CustomerID]&#13;&#10;Group By [Customers].[CustomerID], [Customers].[CompanyName]">
</asp:SqlDataSource>
    <asp:GridView Width="100%" AllowPaging="True" ID="gvCustomers" AutoGenerateColumns="False"
        DataSourceID="sqlDsCustomers" runat="server" ShowHeader="False" OnRowCreated="gvCustomers_RowCreated">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <div class="group" id='<%#String.Format("customer{0}",Container.DataItemIndex) %>'
                        onclick='showhide(<%#String.Format("\"#customer{0}\"",Container.DataItemIndex) %>,<%#String.Format("\"#order{0}\"",Container.DataItemIndex) %>)'>
                        <asp:Image ID="imgCollapsible" CssClass="first" ImageUrl="~/Assets/img/plus.png"
                            Style="margin-right: 5px;" runat="server" /><span class="header">
                                <%#Eval("CustomerID")%>
                                :
                                <%#Eval("CompanyName")%>
                                (<%#Eval("TotalOrders")%>Orders) </span>
                    </div>
                    <div id='<%#String.Format("order{0}",Container.DataItemIndex) %>' class="order">
                        <asp:GridView AutoGenerateColumns="false" CssClass="grid" ID="ddd" runat="server"
                            ShowHeader="true" EnableViewState="false">
                            <RowStyle CssClass="row" />
                            <AlternatingRowStyle CssClass="altrow" />
                            <Columns>
                                <asp:TemplateField ItemStyle-CssClass="rownum">
                                    <ItemTemplate>
                                        <%# Container.DataItemIndex + 1 %>
                                    </ItemTemplate>
                                </asp:TemplateField>
                                <asp:BoundField HeaderText="Order ID" DataField="OrderID" ItemStyle-Width="80px" />
                                <asp:BoundField HeaderText="Date Ordered" DataField="OrderDate" DataFormatString="{0:MM/dd/yyyy}"
                                    ItemStyle-Width="100px" />
                                <asp:BoundField HeaderText="Date Required" DataField="RequiredDate" DataFormatString="{0:MM/dd/yyyy}"
                                    ItemStyle-Width="110px" />
                                <asp:BoundField HeaderText="Freight" DataField="Freight" DataFormatString="{0:c}"
                                    ItemStyle-Width="50px" ItemStyle-HorizontalAlign="Right" />
                                <asp:BoundField HeaderText="Date Shipped" DataField="ShippedDate" DataFormatString="{0:MM/dd/yyyy}"
                                    ItemStyle-Width="100px" />
                            </Columns>
                        </asp:GridView>
                    </div>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
</div>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
</form>

и код позади:

protected void Page_Load(object sender, EventArgs e)
{

}
protected void gvCustomers_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        string custID = ((DataRowView)e.Row.DataItem)["CustomerID"].ToString();
        using (DataClassesDataContext dc=new DataClassesDataContext())
        {
            List<Order> ord = (from o in dc.Orders
                               where o.CustomerID == custID.Trim()
                               select o).ToList();


            GridView ctrl = e.Row.FindControl("ddd") as GridView;
            ctrl.DataSource = ord;
        }
    }
}
protected void Button1_Click(object sender, EventArgs e)
{
    Response.Redirect("Default.aspx");
}

проблема заключается в том, когда я нажимаю кнопку 1 для перенаправленияна другую страницу gvCustomers_RowCreated поднять и я получаю нулевую ссылку ссылки. Почему это событие возникает после обратной передачи?


EDIT 1):

Я удалил SqlDataSource ипривязать GridView к коду:

public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        using (DataClassesDataContext dc=new DataClassesDataContext())
        {
            var query = dc.ExecuteQuery<clsRetern>("SELECT [Customers].[CustomerID], [Customers].[CompanyName], COUNT([OrderID]) TotalOrders FROM [Customers] INNER JOIN [Orders] ON [Customers].[CustomerID]=[Orders].[CustomerID] Group By [Customers].[CustomerID], [Customers].[CompanyName]").ToList();

            List<clsRetern> ret = new List<clsRetern>();
            foreach (var item in query)
            {
                clsRetern r = new clsRetern();
                r.CompanyName = item.CompanyName;
                r.CustomerID = item.CustomerID;
                r.TotalOrders = item.TotalOrders;

                ret.Add(r);
            }

            gvCustomers.DataSource = ret;
            gvCustomers.DataBind();        
        }
    }
}
protected void gvCustomers_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        string custID = ((clsRetern)e.Row.DataItem).CustomerID.Trim();
        using (DataClassesDataContext dc=new DataClassesDataContext())
        {
            List<Order> ord = (from o in dc.Orders
                               where o.CustomerID == custID.Trim()
                               select o).ToList();


            GridView ctrl = e.Row.FindControl("ddd") as GridView;
            ctrl.DataSource = ord;
        }
    }
}
protected void Button1_Click(object sender, EventArgs e)
{
    Response.Redirect("Default.aspx",true);
}
}

public class clsRetern
{
    public string CustomerID { get; set; }
    public string CompanyName { get; set; }
   public int TotalOrders { get; set; }
}

Я пытался Response.Redirect("Default.aspx");, но проблема все еще остается.

Ответы [ 3 ]

2 голосов
/ 30 августа 2011

Если вы понимаете модель страницы ASP.NET, тогда этот вопрос не должен возникать у вас. Каждый раз, когда запрос поступает на страницу ASP.NET, создается новый объект страницы вместе со всем деревом элементов управления, а состояние управляется с использованием состояния просмотра в сценариях постбэк. Таким образом, в вашем случае, когда происходит постбэк, создается новая страница и сетка. Данные для gid-view будут сохранены в состоянии w-view, и сетка будет привязана к этим данным.

Событие RowCreated возникает при создании строки сетки независимо от того, явно ли вызывается DataBind или нет. Цель события такова, что можно настроить с помощью пользовательского интерфейса (ячеек сетки) - например, при необходимости некоторые элементы управления могут быть помещены в ячейки сетки. То же самое должно происходить независимо от сценария обратной передачи, в противном случае эти динамические элементы управления не будут созданы. Как правило, эти элементы управления восстанавливают свое состояние, используя view-state, и вы возвращаете свой пользовательский интерфейс вида сетки (дерево элементов управления) обратно, как это было в первом цикле страницы.

0 голосов
/ 01 апреля 2017

Добавить EnableViewState = False к директиве страницы, чтобы предотвратить запуск «RowCreated» при каждом обратном сообщении.

0 голосов
/ 30 августа 2011

Это потому, что даже если вы запустите Response.Redirect, событие Page_Load все равно будет возбуждено, и если ваш код привязки GridView не находится внутри !IsPostBack, этот код будет вызван.

Попробуйтеэто.

protected void Page_Load(object sender, EventArgs e)
{
    try
    {
        if (!IsPostBack)
        {
            //bind gridview here
        }
    }
    catch (Exception exception)
    {
        //Elmah.ErrorSignal.FromCurrentContext().Raise(exception);
    }
}

смекалка?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...