【问题标题】:How to display all Database data in Grid View using Data Table?如何使用数据表在网格视图中显示所有数据库数据?
【发布时间】:2015-01-23 09:56:57
【问题描述】:

我的数据库中有 5 个数据,我想使用数据表在 gridView 中显示这些数据。但是我的代码只显示 GridView 中最后绑定的数据?我的代码是。请指出错误?

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString);
SqlCommand cmd = new SqlCommand("select Date from MusterRoll where EmpCode='"+code+"' and Month='1' and Year='2015'", conn);
 SqlDataAdapter sda = new SqlDataAdapter(cmd);
 DataSet  ds = new DataSet();
 sda.Fill(ds);
 var rows = ds.Tables[0].Rows;
 foreach (DataRow row in rows)
  {
    string date1 = Convert.ToString(row["Date"]);
    DateTime date2 = Convert.ToDateTime(date1);
    SqlCommand cmd1 = new SqlCommand(" select TOP 1 m.EmpCode,m.NOH,m.OT,m.Late,m.Early,convert(varchar(10),m.Date,103)AS DATE,convert(varchar(10),s1.Shiftname,103)AS Shift From ShiftChange s,ShiftType s1,MusterRoll m  WHERE s1.ShiftID=s.NShiftID and '" + date2 + "'>=Fromdate and Todate>='" + date2 + "' and m.Month = '1' and m.date='"+date2+"' and m.EmpCode='Neena' order by Todate desc", conn);
    SqlDataAdapter sda1 = new SqlDataAdapter(cmd1);
    DataTable  dt = new DataTable();
    sda1.Fill(dt);
    //var rows1 = ds.Tables[0].Rows;
    for (int rowIndex = 0; rowIndex < dt.Rows.Count; rowIndex++)
    {
      DataRow rpw = dt.Rows[rowIndex];
      string EmpCode = rpw.Field<string>("EmpCode");
      string NOH = rpw.Field<string>("NOH");
      string OT = rpw.Field<string>("OT");
      string Latae = rpw.Field<string>("Late");
      string Early = rpw.Field<string>("Early");
      string date3 =rpw.Field<string>("Date");
      string Shift = rpw.Field<string>("Shift");
      gvSingleemp.Visible = true;
      gvSingleemp.DataSource = dt;
      gvSingleemp.DataBind();
         }
        }

在我的 shiftChange 表中没有日期字段,而不是我有 fromDate 和 ToDate。我想根据 MusterRoll 表日期显示员工轮班。所以首先我选择了 MusteRoll date nd checkrd 这个日期存在于 ShiftChange FromDate 和 ToDate 之间(如果存在)显示 Shift

【问题讨论】:

  • 顺便说一下,不要使用dt.Rows[0].ItemArray[0].ToString(),而是使用rpw.Field&lt;string&gt;("EmpCode")。您的代码始终使用循环中的第一行而不是当前行。
  • 我不明白你在做什么。您选择日期,然后循环它们以根据该日期从EmpDetails 中选择数据。但是你想在哪里显示这些记录?你想要多个网格视图吗?如果没有,为什么不通过EmpCode 链接MusterRollEmpDetails?然后,您在一个查询中拥有所有数据,并且该表包含所有数据。
  • @Tim Schmelter,好的,你能指导我如何使用 foreach 循环和 DataTable 填充 GridView
  • 我的意思是你不需要那些循环。我猜你想从EmpDetails 中选择所有记录,其中EmpCode= codeMusterRoll.Month='1' and Year='2015'。那么你只需要一个sql查询来填充一个DataTable,它可以用作gvSingleemp的DataSource。对吗?
  • 你能写更多的代码吗?之后你如何使用rpw?当for循环关闭时?使用 sda 还是只是 sda1 ? ...为什么你实际上想要一个 for 循环?

标签: c# gridview datatable


【解决方案1】:

您正在循环中对GridView 进行数据绑定。您不需要循环,只需将其绑定到DataTable

SqlDataAdapter sda1 = new SqlDataAdapter(cmd1);
DataTable  dt = new DataTable();
sda1.Fill(dt);
gvSingleemp.DataSource = dt;
gvSingleemp.DataBind();

我仍然认为您根本不需要这些循环。我猜你想从EmpDetails 中选择所有记录,其中EmpCode = codeMusterRoll.Month='1' and MusterRoll.Year='2015'。那么你只需要一个sql查询来填充一个DataTable,它可以用作gvSingleemp的DataSource。那是对的吗?

如果是这样,这应该可以工作(注意我使用using 语句和 sql 参数):

DataTable tblData = new DataTable();
string sql = @"SELECT ed.EmpCode,ed.Name,ed.Age,ed.Date 
               FROM MusterRoll mr
               INNER JOIN EmpDetails ed 
                  ON mr.Date = ed.Date
               WHERE mr.EmpCode=@EmpCode AND mr.Month=1 AND mr.Year=2015";
using(var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString))
using(var sda = new SqlDataAdapter(sql, conn))
{
    var codeParam = new SqlParameter("@EmpCode", SqlDbType.VarChar).Value = code; // change type accordingly
    sda.SelectCommand.Parameters.Add(codeParam);
    sda.Fill(tblData); // no need for conn.Open/Close with SqlDataAdapter.Fill
}
gvSingleemp.Visible = true;
gvSingleemp.DataSource = tblData;

如果您不想加入表格,也可以使用EXISTS

string sql = @"SELECT ed.EmpCode, ed.Name, ed.Age, ed.Date 
               FROM  EmpDetails ed
               WHERE EXISTS
               (
                    SELECT 1 FROM MusterRoll mr
                    WHERE  mr.EmpCode = @EmpCode
                     AND   mr.Month = 1 AND mr.Year=2015
                     AND   mr.Date = ed.Date
               )";

【讨论】:

  • 其实这是一个很大的代码,我很容易回答你所有我不能使用没有循环看到我更新的问题
  • 不,我想从 Date= 的 EmpDetails 中选择记录(从第一个查询中获取的日期)。我的意思是如果 date=2014-01-01 则只显示来自 MusterRoll 数据库的日期记录
  • @SaraJohn:我已经删除了他们需要相同的EmpCode 但仅通过日期链接的连接条件。 编辑 还提供了EXISTS 方法,这似乎是最好的方法。
  • 还有其他方式可以和你交流吗?我会用数据库展示我的整个代码。你说的完全正确,但不是我想要的
  • @SaraJohn: 那你得详细解释一下what你想要什么:)
【解决方案2】:

您不必使用循环将 DT 绑定到 GridView :

SqlCommand cmd1 = new SqlCommand(" select EmpCode,Name,Date,Age from  EmpDetails where CompanyID='1'", conn);
 SqlDataAdapter sda1 = new SqlDataAdapter(cmd1);
 DataTable  dt = new DataTable();
 sda1.Fill(dt);
 gvSingleemp.DataSource =dt;
 gvSingleemp.DataBind();

【讨论】:

    【解决方案3】:
    SqlDataAdapter Da = new SqlDataAdapter(cmd);
    
    DataTable  data = new DataTable();
    
    Da.Fill(data);
    
    gvSingleemp.DataSource = data;
    
    gvSingleemp.DataBind();
    

    【讨论】:

    • 您能否详细说明一下如何解决这个问题?
    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多