как обновить только дочерний GridView? - PullRequest
2 голосов
/ 31 марта 2012

вот что я делаю прямо сейчас:

<asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridViewUserScraps_RowDataBound">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                 <asp:TextBox ID="MakeComments" runat="server" TextMode="MultiLine"></asp:TextBox>
                 <asp:Button ID="btnPost" Text="Comment" runat="server" CommandName="Comment"  CommandArgument='<%#Eval("ScrapId")%>' />
                <asp:GridView ID="GridView2" runat="server">
                   <%--this GridView2 showing comments--%>
                </asp:GridView>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

protected void GridViewUserScraps_RowDataBound(object sender, GridViewRowEventArgs e)
{
    GridView gv = new GridView();
    gv = (GridView)row.FindControl("GridView2");
    //getting data to bind child gridview.
    gv.DataSource = td;
    gv.DataBind();
}

так, по нажатию кнопки GridView1 я обновляю базу данных и одновременно извлекаю данные, в этом нет никаких проблем.Но для этого мне нужно привязать / обновить родительский (GridView1) Gridview, который довольно медленный процесс, так как там почти 50 строк.что я смотрю Я хочу обновить или обновить только GridView2 для отображения добавленных комментариев.

Ответы [ 6 ]

1 голос
/ 03 апреля 2012

GridView1.RowCommand - правильное событие для обработки действия кнопки.

GridView1.RowCommand += (o, e) =>
    {
        var row = (e.CommandSource as Button).NamingContainer as GridViewRow;
        var makeComments = row.FindControl("MakeComments") as TextBox;
        int scrapId = Int32.TryParse((string)e.CommandArgument, out scrapId) ? scrapId : 0;
        var gridView2 = row.FindControl("GridView2") as GridView;

        ... place here the code which the comments

        gridView2.DataSource = GetCommentsByScrapId();
        gridView2.DataBind();
    };

Для этого события (или других) родитель не будет связываться, если вы его не укажете. Одной из распространенных причин привязывания элемента управления является ошибочный вызов DataBind() каждый раз при загрузке страницы. Чтобы предотвратить это, необходимо выполнить привязку к первому запросу страницы, и правильный способ - проверить, не является ли IsPostBack ложным.

protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                 GridView1.DataSource = GetUserScraps();
                 GridView1.DataBind();
            }
        }
0 голосов
/ 09 апреля 2012

Обновлять / обновлять только дочерний GridView2 в строке, где была нажата кнопка Обновить

Прежде всего вам нужно поместить весь GridView1 в панель обновления. И дочерний GridView внутри другого UpdatePanel Затем нажмите кнопку U, чтобы сохранить данные и обновить дочернюю сетку, таким образом обновится только дочерняя сетка.

Вот рабочий пример.

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

namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if(!Page.IsPostBack)
        {
            SqlConnection conn = new SqlConnection("Password=password;Persist Security Info=True;User ID=uid;Initial Catalog=Northwind;Data Source=servername");
            SqlCommand cmd = new SqlCommand("select top 10 * from orders", conn);
            cmd.Connection.Open();
            var dt = cmd.ExecuteReader();
            GridView1.DataSource = dt;
            GridView1.DataBind();
            cmd.Connection.Close();
            cmd.Dispose();
        }

    }

    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {

    }

    protected void GridView1_RowCommand(Object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "UpdateChildGrid")
        {

            GridViewRow row = (e.CommandSource as Button).NamingContainer as GridViewRow;
            GridView child = row.FindControl("GridView2") as GridView;

            string id = row.Cells[0].Text;

            SqlConnection conn = new SqlConnection("Password=password;Persist Security Info=True;User ID=uid;Initial Catalog=Northwind;Data Source=servername");
            SqlCommand cmd = new SqlCommand("select top 5 * from [order Details] where OrderID = " + id, conn);
            cmd.Connection.Open();
            var dt = cmd.ExecuteReader();
            child.DataSource = dt;
            child.DataBind();
            cmd.Connection.Close();
            cmd.Dispose();
        }
    }



    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            string id = e.Row.Cells[0].Text;
            GridView gv = new GridView();
            gv = (GridView)e.Row.FindControl("GridView2");
            SqlConnection conn = new SqlConnection("Password=password;Persist Security Info=True;User ID=uid;Initial Catalog=Northwind;Data Source=servername");
            SqlCommand cmd = new SqlCommand("select top 5 * from [order Details] where OrderID = " + id, conn);
            cmd.Connection.Open();
            var dt = cmd.ExecuteReader();
            gv.DataSource = dt;
            gv.DataBind();
            cmd.Connection.Close();
            cmd.Dispose();
        }


    } 

}

}

И код позади

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>


<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
    <p>

    To learn more about ASP.NET visit <a href="http://www.asp.net" title="ASP.NET Website">www.asp.net</a>.
</p>
<p>
    You can also find <a href="http://go.microsoft.com/fwlink/?LinkID=152368&amp;clcid=0x409"
        title="MSDN ASP.NET Docs">documentation on ASP.NET at MSDN</a>.
</p>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">

<ContentTemplate>
    <asp:GridView ID="GridView1" runat="server" 
    onselectedindexchanged="GridView1_SelectedIndexChanged" 
    AutoGenerateColumns="False" 
    onrowcommand="GridView1_RowCommand" onrowdatabound="GridView1_RowDataBound">
    <Columns>
        <asp:BoundField DataField="OrderID"  />
        <asp:TemplateField>
            <ItemTemplate>
                <asp:UpdatePanel ID="UpdatePanel2" runat="server">
                <ContentTemplate>
                    <asp:TextBox ID="MakeComments" runat="server" TextMode="MultiLine"></asp:TextBox> 
                    <asp:Button ID="btnPost" ButtonType="Button" Text="Comment" runat="server" CommandName="UpdateChildGrid" />
                    <asp:GridView ID="GridView2" runat="server"> 
                    </asp:GridView> 
                </ContentTemplate>
                </asp:UpdatePanel>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>

</asp:GridView>
</ContentTemplate>

</asp:UpdatePanel>
</asp:Content>
0 голосов
/ 03 апреля 2012

Я бы установил имя команды кнопки, затем использовал бы событие OnRowCommand gridview

<asp:gridview id="GridView1" runat="server" onrowdatabound="GridViewUserScraps_RowDataBound" OnRowCommand="GridView1_RowCommand">
<Columns>
    <asp:TemplateField>
        <ItemTemplate>
            <asp:TextBox ID="MakeComments" runat="server" TextMode="MultiLine"></asp:TextBox>
            <asp:Button ID="btnPost" Text="Comment" runat="server" CommandName="UpdateChildGrid" />
            <asp:GridView ID="GridView2" runat="server">
                <%--this GridView2 showing comments--%>
            </asp:GridView>
        </ItemTemplate>
    </asp:TemplateField>
</Columns>

Код сзади:

protected void GridView1_RowCommand(Object sender, GridViewCommandEventArgs e)
  {
    if(e.CommandName=="UpdateChildGrid")
    {
        GridViewRow row = (e.CommandSource as Button).NamingContainer as GridViewRow;
        GridView child = row.FindControl("GridView2") as GridView;
        // update child grid
    }
  }

Делая это из памяти, чтобыможет быть не точным, но должно быть достаточно близко, чтобы дать вам представление о том, куда идти

0 голосов
/ 03 апреля 2012

GridView HTML

<asp:gridview id="GridView1" runat="server" onrowdatabound="GridViewUserScraps_RowDataBound">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:TextBox ID="MakeComments" runat="server" TextMode="MultiLine"></asp:TextBox>
                <asp:Button ID="btnPost" Text="Comment" runat="server" OnClick="btnPost_Click" />
                <asp:GridView ID="GridView2" runat="server">
                    <%--this GridView2 showing comments--%>
                </asp:GridView>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:gridview>

Код позади

protected void btnPost(object sender, EventArgs e)
{
    //Your code for other operations
    //
    GridView GridView2 = (GridView)((GridViewRow)((Button)sender).NamingContainer).FindControl("GridView2");
    GridView2.DataSource = YourDataBasefetchingFunction();
    GridView2.DataBind() 
}

Примечание - преобразовать ScrapID DataItem в DataKey

0 голосов
/ 31 марта 2012

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

foreach(GridViewRow rIndex in GridView1.Rows)
{

GridView gv = new GridView();
    gv = (GridView)row.FindControl("GridView2");
    //getting data to bind child gridview.
   // if you want to get the row key value use GridView1.DataKeys[rIndex.RowIndex].Value
    gv.DataSource = td;
    gv.DataBind();

}
0 голосов
/ 31 марта 2012

Вы можете обновить только дочернюю сетку, не обновляя родительскую сетку. Чтобы сделать это, вы можете выполнить щелчок на стороне клиента (ClientClick) для кнопки и вызвать функцию jquery вместо щелчка на стороне сервера. Затем вы можете обновить только элементы в вашем дочернем сеточном представлении, вызвав веб-метод или класс обработчика http из конкретной функции jquery через вызов ajax. Здесь ваша родительская сетка не будет обновлена, так как сервер не нажимает на нажатие кнопки. Надеюсь, это поможет, и, если вам нужно, я предоставлю пример кода для функции jquery.

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