我有一个填充gridview的数据集。 gridview必须填充一个数据集和多个查询(或此实例中的数据表)。
正如您在代码中看到的,我使用了2个DataTables。这些数据表是从数据库(使用sql server)填充的。数据表被添加到一个数据集中。在ASP代码中,您可以看到gridview中有3个标签和3列。前两列来自第一个数据表或第一个查询。第二个查询填充了最后一列或第三列。
当我运行此代码时,它在数据集中找不到lblThree
。 LblThree
在数据集中,但在第二个表中,.NET不知道我猜。你们知道这个错误的解决方案,所以我可以用一个数据集填充我的gridview吗?
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
namespace TwoDatatableToDataset
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
loadAll();
}
}
private void loadAll()
{ // STEP ONE Put one sql output in an empty dataset: (works well)
//DataSet ds = new DataSet();
//DataTable dt2 = new DataTable();
//string sql = "select SID1 as lblOne, Charge_Amount as lblTwo from [xxx].[xxxx].[xxxx]";
//SqlConnection Scon = new SqlConnection(ConfigurationManager.ConnectionStrings["testserver"].ConnectionString);
//SqlCommand Scmd = new SqlCommand(sql, Scon);
//Scmd.CommandType = CommandType.Text;
//SqlDataAdapter adp = new SqlDataAdapter(Scmd); // all data in adapter
//Scon.Open();
//adp.Fill(ds); //Adapter in dataset
//GridView1.DataSource = ds; //dataset in gridview
//GridView1.DataBind();
//STEP TWO Make 2 datatables set them in one dataset
DataSet ds = new DataSet();
DataTable dt = new DataTable();
DataTable dt2 = new DataTable();
string sql = "select SID1 as lblOne, Charge_Amount as lblTwo from [xxxx].[xxxx].[xxxx]";
SqlConnection Scon = new SqlConnection(ConfigurationManager.ConnectionStrings["testserver"].ConnectionString);
SqlCommand Scmd = new SqlCommand(sql, Scon);
Scmd.CommandType = CommandType.Text;
SqlDataAdapter adp = new SqlDataAdapter(Scmd); // all data in adapter
Scon.Open();
adp.Fill(dt); //Adapter in dataset
sql = "select Currency as lblThree from [xxx].[dbo].[tbl_xx_NI]";
Scmd = new SqlCommand(sql, Scon);
Scmd.CommandType = CommandType.Text;
adp = new SqlDataAdapter(Scmd); // all data in adapter
adp.Fill(dt2); //Adapter in dataset
ds.Tables.Add(dt); //add data table to data set
ds.Tables.Add(dt2);
GridView1.DataSource = ds; //dataset in gridview
GridView1.DataBind(); // ERROR: A field or property with the name 'lblThree' was not found on the selected data source.
Scon.Close();
}
}
}
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TwoDatatableToDataset._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
AutoGenerateDeleteButton="False" AutoGenerateEditButton="False">
<Columns>
<asp:BoundField DataField="lblOne" HeaderText="One" SortExpression="lblOne">
<ItemStyle Width="20%"/>
</asp:BoundField>
<asp:BoundField DataField="lblTwo" HeaderText="Two" SortExpression="lblTwo">
<ItemStyle Width="20%" />
</asp:BoundField>
<asp:BoundField DataField="lblThree" HeaderText="Three" SortExpression="lblThree">
<ItemStyle Width="20%" />
</asp:BoundField>
</Columns>
</asp:GridView>
</div>
</form>
</body>
</html>
答案 0 :(得分:2)
您可以致电Merge
。
DataTable dt1 = ds.Tables[0];
DataTable dt2 = ds.Tables[1];
dt1.Merge(dt2);
好像这是您基本上想要绑定的表。无论如何,尝试这个并断开合并方法。跳过并查看dt1
的样子。
答案 1 :(得分:1)
也许您可以在sql命令中使用UNION,如下所示:
从[xxxx]选择SID1为lblOne,Charge_Amount为lblTwo。[xxxx]。[xxxx] 联盟 从[xxxx]中选择货币为lblThree。[dbo]。[tbl_xx_NI]
答案 2 :(得分:1)
正确的解决方案实际上取决于您要做的事情。您可能需要考虑两个主要选项:
DataSet
,并使用LINQ GridView
或ListView
生成预期的输出就个人而言,我会选择LINQ选项,但这取决于你。下面的文章应该有助于让您指出正确的方向。
http://geekswithblogs.net/shahed/archive/2009/02/11/129310.aspx
答案 3 :(得分:1)
或者,您无法使用在查询中使用的过滤器在数据库中创建视图,以便它表示包含您需要的所有信息的数据集,以便您可以查询视图并将结果存储在单个数据表中?