2010-03-13 3 views
0

У меня есть набор данных, который имеет два типа данных.Как получить набор строк из таблицы данных

В первом DataTable у меня EMPNO, EmpName и EmpAddress

Во втором DataTable У меня есть EMPNO, EmpJoindate, EmpSalary.

Я хочу, чтобы результат, в котором я должен показать EmpName как этикетки и его/ее данные в GridView

Я заселить DataList с первым столом, и есть Empno как ключевых полей.

Затем я заполняю gridview внутри datatable, который имеет EmpNo, EmpJoinDate и EmpAddress.

Мой код некоторые, что, как показано ниже

 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 => a.eno = EmpNo) и привязывает этот список к gridview.

Как это сделать в datatable.

любезно не дает мне предложений об изменении хранимой процедуры, которая приводит к значениям в двух таблицах, потому что это не может быть изменено. Мне нужно найти решение внутри существующих объектов.

С уважением Хема

Привет, Я модифицировал программу, как показано ниже Игоря, вместо DataRelation (мой TL не одобряю) Я использовал IEnumerable

DataTable дт = новый DataTable() ; dt.Columns.Add ("EmpNo"); для (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 ложные BOOL
  • ItemArray {объект [2]} объекта [] [0] объект "65" {строка} [1] "А" объект {строка} RowError "" строка RowState Добавлено System.Data.DataRowState
  • Таблица {} System.Data.DataTable
  • Статические члены
  • непубличных членов
+0

увидеть мой обновленный ответ. – garik

ответ

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()); 
    } 
} 

В вашем случае следует назначить DataSource из detailt DataGrid в currentMasterRow.GetChildRows(masterDetailRelation)

Смежные вопросы