Синхронизация данных при использовании GridView внутри UpdatePanel - PullRequest
0 голосов
/ 23 ноября 2018

Данные в моем GridView внутри UpdatePanel не синхронизируются с базой данных, и я не могу понять, почему.Это привело к неправильным обновлениям базы данных, которые я должен быстро исправить!Кто-нибудь может помочь?

У меня есть несколько UpdatePanels с GridViews внутри, которые могут быть отредактированы пользователем.Есть функция поиска и кнопки фильтра, которые выбирают запрашиваемые данные из базы данных и отображают в GridView.Сортировка включена, и "несинхронность" возникает в основном при сортировке и последующем редактировании поля.

Данные поступают из базы данных SQL.Я могу обновить данные напрямую через опцию OnTextChange моего TemplateField следующим образом:

<asp:GridView 
    ID="GridView4" 
    runat="server" 
    OnSorting="TaskGridView_Sorting" 
    AllowSorting="True" 
    Width="100%" >
    <Columns>
    <asp:TemplateField SortExpression="name" HeaderText="Name">
    <HeaderStyle HorizontalAlign="Left" CssClass="col_name" />
    <ItemTemplate>
        <asp:TextBox ID="name" AutoPostBack="True" CssClass="col_name" runat="server" Text='<%# Eval("name") %>' Width=180 OnTextChanged="text_change" />
    </ItemTemplate>                 
    </asp:TemplateField> 
    ...

У меня есть вид сетки внутри UpdatePanel, который имеет следующие опции:

    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
         ...

Я включил частичный рендерингкак это:

    <ajaxToolKit:ToolkitScriptManager EnablePartialRendering="true" runat="server" />

У меня есть кнопки, которые фильтруют данные, запрашивая базу данных и отображая только отфильтрованные данные, как это:

DataGrid_Load(DAL.Search_reg_log(OrgText.Text, searchText, searchCol), "reg");

В gridview загружаются данные следующим образом:

private void DataGrid_Load(DataTable command, string type)
{   
    DataTable dataTable = new DataTable();
    dataTable = command;
    string sortDir = ViewState["SortDirection"] as string;
    string sortExp = ViewState["SortExpression"] as string;

    if(ViewState["SortExpression"] != null)
    {                   
        dataTable = resort(dataTable, sortExp, sortDir);
    }

    try 
    {
        var query = from c in dataTable.AsEnumerable() 
                   where c.Field<string>("status") == "Invoiced" && c.Field<string>("reg_cat_id") != "Archive"
                      || c.Field<string>("status") == "Confirmed" && c.Field<string>("reg_cat_id") != "Archive" 
                  select c ;    

        if(query.Any()){
            DataTable t2 = query.CopyToDataTable();
            GridView4.DataSource = t2;
            GridView4.DataBind();
        } else {
            GridView4.DataSource = new DataTable();
            GridView4.DataBind();
        }
    }           
    catch(Exception e) {
        ErrorText.Text = "Caught Exception: " + e;              
    }

...

Я выделил одну причину ошибок данных, которая возникает после сортировки столбца, а затем

protected void TaskGridView_Sorting(object sender, GridViewSortEventArgs e)
{               
    string sortExp = ViewState["SortExpression"] as string;     
    string sortDir = ViewState["SortDirection"] as string;
    if(sortDir == "asc" & sortExp == e.SortExpression.ToString())
        ViewState["SortDirection"] = "desc";
    else
        ViewState["SortDirection"] = "asc";
    ViewState["SortExpression"] = e.SortExpression.ToString();

    if(searchCol != "" && searchText != "")
        DataGrid_Load(DAL.Search_reg_log(OrgText.Text, searchText, searchCol), "reg");
    else
        DataGrid_Load(DAL.reg_log(HeadText.Text, OrgText.Text), "reg");     

    UpdatePanels();

}

Вот функция курорта:

public static DataTable resort(DataTable dt, string colName, string direction)
{
    dt.DefaultView.Sort = colName + " " + direction;
    dt = dt.DefaultView.ToTable();
    return dt;
}

Пожалуйста, помогите с некоторыми направлениями того, что может быть причиной этого.

1 Ответ

0 голосов
/ 27 ноября 2018

Похоже, у вас возникли проблемы с GridView и их обновлением.Я опубликую полный рабочий пример ниже.Начните с этого и постепенно обновляйте этот код в соответствии со своими потребностями, например, получая данные с помощью var query = from c in dataTable.AsEnumerable().Важно сортировать данные каждый раз, когда вы (пере) связываете данные GridView.И я не уверен, что происходит внутри resort, но вы должны использовать dt.DefaultView.ToTable();, чтобы сохранить сортировку в DataTable.

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

        <asp:GridView ID="GridView1" runat="server"
            DataKeyNames="ID" AllowSorting="true" 
            OnSorting="GridView1_Sorting"
            AutoGenerateColumns="false" 
            AutoGenerateEditButton="true"
            OnRowEditing="GridView1_RowEditing"
            OnRowCancelingEdit="GridView1_RowCancelingEdit"
            OnRowUpdating="GridView1_RowUpdating">
            <Columns>

                <asp:TemplateField HeaderText="ID" SortExpression="ID">
                    <ItemTemplate>
                        <%# Eval("ID") %>
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Name" SortExpression="name">
                    <ItemTemplate>
                        <%# Eval("name") %>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox1" runat="server" Text=' <%# Eval("name") %>'></asp:TextBox>
                    </EditItemTemplate>
                </asp:TemplateField>

            </Columns>
        </asp:GridView>

        <asp:Literal ID="Literal1" runat="server"></asp:Literal>

    </ContentTemplate>
</asp:UpdatePanel>

Код позади

protected void Page_Load(object sender, EventArgs e)
{
    //bind data in an ispostback check
    if (!IsPostBack)
    {
        DataGrid_Load();
    }
}


private void DataGrid_Load()
{
    //load the datatable data
    DataTable dt = source;

    //check if the viewsstate existst
    if (ViewState["SortExpression"] != null && ViewState["SortDirection"] != null)
    {
        //sort the datatable before binding it to the gridview
        dt.DefaultView.Sort = ViewState["SortExpression"] + " " + ViewState["SortDirection"];
        dt.DefaultView.ToTable();
    }

    //bind the sorted datatable to the gridvidw
    GridView1.DataSource = dt;
    GridView1.DataBind();
}


protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
    //load the previous sorting settigns
    string sortExp = ViewState["SortExpression"] as string;
    string sortDir = ViewState["SortDirection"] as string;

    //reverse the direction if the column is the same as the previous sort
    if (sortDir == "asc" & sortExp == e.SortExpression.ToString())
        ViewState["SortDirection"] = "desc";
    else
        ViewState["SortDirection"] = "asc";

    //put the current sort column in the viewstate
    ViewState["SortExpression"] = e.SortExpression.ToString();

    //rebind data
    DataGrid_Load();
}


protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
    //set the edit index and rebind data
    GridView1.EditIndex = e.NewEditIndex;
    DataGrid_Load();
}


protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
    //reset the edit index and rebind data
    GridView1.EditIndex = -1;
    DataGrid_Load();
}


protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    //use findcontrol to locate the textbox in the edit template
    TextBox tb = (TextBox)GridView1.Rows[e.RowIndex].FindControl("TextBox1");

    //get the id of the row from the datakeys
    int id = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values[0]);

    //show result for testing
    Literal1.Text = "ID: " + id + "<br>Name: " + tb.Text;

    //reset the edit index and rebind data
    GridView1_RowCancelingEdit(null, null);
}
...