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 中的数据。
(在数据库更新时)
GridView
在 UpdatePanel
内。
我正在尝试一些事情,例如:
重新评估 DataSourceID
并使 gridView.DataBind();
在 null
中评估 DataSourceID
,生成 gridView.DataBind();
,并重新评估 DataSourceID
并生成 gridView.DataBind();
我也试过了:
DataSourceSelectArguments argumentos = new DataSourceSelectArguments();
PRODUCTOS_CON_STOCK.Select(argumentos);
gridView.DataBind();
- 将
UpdatePanel
设置为 updatemode="Always"
但是所有这些都奏效了……
有人可以帮助我吗?
谢谢。
为什么不转储 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
中保存了 GridView
和 SqlDataSource
,虽然我再次执行了 Select 语句,但我正在获取旧的价值观。
我在 Session
中保存了该信息,因为 AJAX
直接执行方法,而 GridView
和 SqlDataSource
是 null
最后我尝试通过按钮从 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();
}
这样一来,我不用点击任何按钮就可以“自动”刷新数据
首先,如果我的英文有误,请见谅...
我正在用 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 中的数据。
(在数据库更新时)
GridView
在 UpdatePanel
内。
我正在尝试一些事情,例如:
重新评估
DataSourceID
并使gridView.DataBind();
在
null
中评估DataSourceID
,生成gridView.DataBind();
,并重新评估DataSourceID
并生成gridView.DataBind();
我也试过了:
DataSourceSelectArguments argumentos = new DataSourceSelectArguments();
PRODUCTOS_CON_STOCK.Select(argumentos);
gridView.DataBind();
- 将
UpdatePanel
设置为updatemode="Always"
但是所有这些都奏效了…… 有人可以帮助我吗?
谢谢。
为什么不转储 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
中保存了 GridView
和 SqlDataSource
,虽然我再次执行了 Select 语句,但我正在获取旧的价值观。
我在 Session
中保存了该信息,因为 AJAX
直接执行方法,而 GridView
和 SqlDataSource
是 null
最后我尝试通过按钮从 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();
}
这样一来,我不用点击任何按钮就可以“自动”刷新数据