如何从数据表中获取一组行

时间:2010-03-13 09:23:57

标签: c# .net asp.net

我有一个有两个数据表的数据集。

在第一个数据表中我有EmpNo,EmpName和EmpAddress

在第二个数据表中我有Empno,EmpJoindate,EmpSalary。

我想要一个结果,我应该在gridview中显示EmpName作为标签和他/她的详细信息

我使用第一个表填充数据表,并将EmpNo作为数据键。

然后我在拥有EmpNo,EmpJoinDate和EmpAddress的数据表中填充gridview。

我的代码如下所示

       Datalist1.DataSource = dt;
        Datalist1.DataBind();

        for (int i = 0; i < Datalist1.Items.Count; i++)
        {
            int EmpNo = Convert.ToInt32(Datalist1.DataKeys[i]);
            GridView gv = (GridView)Datalist1.FindControl("gv");
            gv.DataSource = dt2;
            gv.DataBind();
        }

现在我遇到了问题,我必须将相应员工的详细信息绑定到gridview。而上述代码将显示gridview中所有员工的所有详细信息。

如果我们使用IEnumerable,我们给出一个条件,其中(a =&gt; a.eno = EmpNo),并将该列表绑定到gridview。

我如何在数据表中执行此操作。

请不要给我改变存储过程的建议,这会导致两个表中的值,因为这不能改变。 我必须在现有的对象中找到解决方案。

此致 HEMA

您好, 我修改了如下程序 伊戈尔,而不是datarelation,(我的TL不赞成它)我使用IEnumerable

DataTable dt = new DataTable();         dt.Columns.Add( “EMPNO”);         for(int i = 65; i <70; i ++)         {             DataRow dr = dt.NewRow();             dr [“EmpNo”] = i.ToString();             dt.Rows.Add(DR);         }

    DataTable dt2 = new DataTable();
    dt2.Columns.Add("EmpNo");
    dt2.Columns.Add("EmpName");
    for (int i = 65; i < 70; i++)
    {
        DataRow dr = dt2.NewRow();
        dr["EmpNo"] = i.ToString();

        dr["EmpName"] = Convert.ToChar(i);
        dt2.Rows.Add(dr);
    }


    Datalist1.DataSource = dt;
    Datalist1.DataBind();
    IEnumerable<DataRow> sequence = dt2.AsEnumerable();

    for (int i = 0; i < Datalist1.Items.Count; i++)
    {
        string EmpNo = Datalist1.DataKeys[i].ToString();
        string strExpr = "EmpNo =" + EmpNo.ToString();
        GridView Gridview1 = (GridView)Datalist1.Items[i].FindControl("Gridview1");
        Gridview1.DataSource = sequence.Where(t => t.Field<string>("EmpNo") == EmpNo);
        Gridview1.DataBind();
    }

我的Designer.aspx如下

 <asp:DataList ID="Datalist1" runat="server" DataKeyField="EmpNo">
            <ItemTemplate>
                <asp:GridView ID="Gridview1" runat="server">
                </asp:GridView>
            </ItemTemplate>
        </asp:DataList>

执行时我没有观察到任何结果,我看到错误为

屏幕上的RowError HasErrors

我在gridview中包含了绑定字段控件 如

<asp:GridView ID="Gridview1" AutoGenerateColumns="true" runat="server">
                <Columns>
                <asp:BoundField DataField="EmpNo" />
                </Columns>
                </asp:GridView>

在执行时,它会抛出一个错误说明 在所选数据源上找不到名为“EmpNo”的字段或属性。

我使用调试模式检查了“序列”,它在数组中有值,  我已经强调了,

所以我哪里出错了

  • 结果视图展开结果视图将枚举IEnumerable
  • [0] {System.Data.DataRow} System.Data.DataRow     HasErrors false bool
  • ItemArray {object [2]} object []      [0]“65”对象{string}     [1]“A”对象{string}     RowError“”字符串     RowState添加了System.Data.DataRowState
  • 表{} System.Data.DataTable
  • 静态成员
  • 非公开会员

1 个答案:

答案 0 :(得分:1)

1)您必须在这两个表之间添加关系:Master和Detail(使用DataSet编辑器)。

2)然后使用关系来检索相关记录,例如:

DataRelation customerOrdersRelation =
    customerOrders.Relations.Add("CustOrders",
    customerOrders.Tables["Customers"].Columns["CustomerID"],
    customerOrders.Tables["Orders"].Columns["CustomerID"]);

foreach (DataRow custRow in customerOrders.Tables["Customers"].Rows)
{
    Console.WriteLine(custRow["CustomerID"].ToString());

    foreach (DataRow orderRow in custRow.GetChildRows(customerOrdersRelation))
    {
        Console.WriteLine(orderRow["OrderID"].ToString());
    }
}

在您的情况下,您应该将detailt datagrid的DataSource分配给currentMasterRow.GetChildRows(masterDetailRelation)