Gridview.Databind() 不刷新数据

Gridview.Databind() not refresh the data

首先,如果我的英文有误,请见谅...

我正在用 C# 制作网页,但在刷新 GridView 中显示的数据时遇到了一些问题

我正在获取在 aspx 视图中定义的 SqlDataSource 的数据:

<asp:SqlDataSource ID="PRODUCTOS_CON_STOCK" runat="server" ConnectionString="<%$ ConnectionStrings:XXXX %>" ProviderName="<%$ ConnectionStrings:XXX.ProviderName %>" DataSourceMode="DataSet" SelectCommand=" select EAN, CODART.....  "> </asp:SqlDataSource>

当我单击一个按钮时,我更新了数据库中的一些数据,我想用新数据刷新 GridView,而不重新加载页面。 我正在制作:gridView.DataBind();,但这不会刷新 GridView 中的数据。

(在数据库更新时)

GridViewUpdatePanel 内。

我正在尝试一些事情,例如:

    DataSourceSelectArguments argumentos = new DataSourceSelectArguments();
    
    PRODUCTOS_CON_STOCK.Select(argumentos);
    
    gridView.DataBind();

但是所有这些都奏效了…… 有人可以帮助我吗?

谢谢。

为什么不转储 PRODUCTOS_CON_STOCK 页面上的数据源设置。

我发现什么时候需要过滤、加载和播放?

只需从标记中删除数据源。所以,在你的GridView中,去掉PRODUCTOS_CON_STOCK的数据源id设置,然后删除数据源

您必须多写一点代码,但您现在可以控制数据,更重要的是,可以控制您需要和想要的参数。

所以,假设我有这个标记:

一个网格,还有一个search/text框来过滤网格。

<asp:Label ID="Label1" runat="server" Text="Search for Fighter jet" Font-Size="Large"></asp:Label>
<asp:TextBox ID="txtSearch" runat="server" Style="margin-left:15px" Font-Size="Large">
</asp:TextBox>

<asp:Button ID="cmdSearch" runat="server" Text="search"
    style="margin-left:15px" CssClass="btn" OnClick="cmdSearch_Click" />

<br />
<br />

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="ID" CssClass="table"  >
        <Columns>
            <asp:BoundField DataField="Fighter" HeaderText="Fighter"  />
            <asp:BoundField DataField="Engine" HeaderText="Engine"  />
            <asp:BoundField DataField="Thrust" HeaderText="Thrust"  />
            <asp:BoundField DataField="Description" HeaderText="Description" />

            <asp:TemplateField HeaderText="View">
                <ItemTemplate>
                <asp:ImageButton ID="btnImage" runat="server" Height="68px" Width="149px"
                    OnClientClick ="popimage(this);return false"
                    ImageUrl = '<%# Eval("ImagePath") %>' /> 
                </ItemTemplate>
            </asp:TemplateField>

        </Columns>
    </asp:GridView>

注意关闭 - 我确实使用向导构建了这个网格。但我随后删除了 GV 的数据源 ID,并删除了在标记中创建的数据源。

所以,现在我要加载的代码是这样的:

   protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadGrid("");
    }

    void LoadGrid(string MySearch)
    {
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (SqlCommand cmdSQL = new SqlCommand("SELECT * from Fighters ", conn))
            {
                if (MySearch != "")
                {
                    cmdSQL.CommandText += @" WHERE Fighter LIKE @Fighter + '%'";
                    cmdSQL.Parameters.Add("Fighter", SqlDbType.NVarChar).Value = MySearch;
                }
                conn.Open();
                DataTable rstData = new DataTable();
                rstData.Load(cmdSQL.ExecuteReader());
                GridView1.DataSource = rstData;
                GridView1.DataBind();
            }
        }
    }

我明白了:

并注意文本框的“可选”过滤器。如果你输入一些文本,(我在 sql 中使用了“like”匹配),那么代码就是这样的:

    protected void cmdSearch_Click(object sender, EventArgs e)
    {
        LoadGrid(txtSearch.Text);
    }

但是,这里的想法通常是转储放置在标记中的 SqlDataSoruce 并滚动 + 编写您自己的代码要好得多。问题是您可以尝试在代码中设置数据源,但也可以在页面上设置数据源——它们相互争夺。所以,试试上面的想法 - 并删除标记中的数据源。

我终于解决了这个问题。

在我的例子中,我在前面调用,在 AJAX 中,C# 方法,该方法是一个 WebMethod HttpPost

问题是我在 Session 中保存了 GridViewSqlDataSource,虽然我再次执行了 Select 语句,但我正在获取旧的价值观。

我在 Session 中保存了该信息,因为 AJAX 直接执行方法,而 GridViewSqlDataSourcenull

最后我尝试通过按钮从 GridVeiw 刷新,并且信息更新正确,所以,我隐藏了按钮,并在 [=12] 中模拟了 click 按钮=]:

$.ajax({
        type: 'POST',
        url: pageUrl,
        data: JSON.stringify({ gridMod: gridMod }),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function() {
            document.getElementById("<%= btnReload.ClientID %>").click();
        },
    });

因此,单击事件调用 LoadGrid();,并执行:

private void LoadGrid()
    {

        DataSourceSelectArguments argumentos = new DataSourceSelectArguments();

        PRODUCTOS_CON_STOCK.Select(argumentos);


        eanList.DataBind();


    }

这样一来,我不用点击任何按钮就可以“自动”刷新数据