2017-01-17 2 views
-1

Я пытаюсь заполнить gridview вручную созданным datatable. У меня две таблицы: «hr_vacancy» второй - «hr_profile». имеют соответствующую колонку «обозначение» и «масштаб». В hr_vacancy есть столбец «working».DataTable Manual Rows Insert: эта строка уже принадлежит этой таблице

Я должен показать количество записей в gridview, которые зависят от количества «работающих». Если в работе у меня есть (например, 3 количество), тогда я проверю погоду профиля, добавьте 3 профиля с таким же «обозначением», который имеет 3 количества в столбце «hr_vacancy.working».

Скажем, если введены два профиля, две записи из «hr_profile» и одна пустая строка, имеющая только это обозначение. Я написал код, который прикреплен, но когда я связываю новый «dr» с datatable, он показывает ошибку, которая «эта строка уже принадлежит этой таблице»

User user = new User(); 
Util myUtil = new Util(); 
DbManager dbManager = new DbManager(); 
string strSQL = ""; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     DataTable dttempEmployee = new DataTable("TempEmployee"); 
     strSQL = "Select hfmiscode from profile where hfmiscode='1'"; 
     dttempEmployee = dbManager.FillDataTable(strSQL); 
     DataRow dr = dttempEmployee.NewRow(); 

     strSQL = "select * from hr_vacancy where hfmiscode='398101' order by CONVERT(int, scale) desc"; 
     DataTable dtVacancy = dbManager.FillDataTable(strSQL); 

     if (dtVacancy.Rows.Count > 0) 
     { 
      int intRowCountVacancy=0; 
      string strDesignation = string.Empty; 
      string strWorking = string.Empty; 

      intRowCountVacancy = dtVacancy.Rows.Count; 

      for (int i = 0; i < intRowCountVacancy; i++) 
      { 
       strDesignation = Convert.ToString(dtVacancy.Rows[i]["Designation"]); 
       strWorking = Convert.ToString(dtVacancy.Rows[i]["working"]); 

       for (int j = 0; j < Convert.ToInt32(strWorking); j++) 
       { 
        strSQL = "select * from profile where hfmiscode='398101' and designation='" + strDesignation +"'"; 
        DataTable dtProfileGet = dbManager.FillDataTable(strSQL); 

        if (dtProfileGet.Rows.Count > 0 || dtProfileGet.Rows.Count == Convert.ToInt32(strWorking)) 
        { 
         if (j != Convert.ToInt32(strWorking)) 
         { 
          // dttempEmployee.NewRow(); 

          if (dtProfileGet.Rows[j]["hfmiscode"] == DBNull.Value) 
          { 
           dr["hfmiscode"] = "-"; 
          } 
          else 
          { 
           dr["hfmiscode"] = Convert.ToString(dtProfileGet.Rows[j]["hfmiscode"]); 
          } 
         } 
        } 
        else 
        { 
         if (j != Convert.ToInt32(strWorking)) 
         { 
           // dttempEmployee.NewRow(); 
           dr["hfmiscode"] = "-"; 
         } 
        } 
        dttempEmployee.Rows.Add(dr); 
       } 
      } 
     } 
     GridView1.DataSource = dttempEmployee; 
     GridView1.DataBind(); 
    } 
} 

Примечание: Я использовал «hfmiscode» только один столбец из таблицы hr_profile. Позже я добавлю несколько столбцов.

+0

Советы по заданию вопросов: не добавляйте срочные просьбы или попросите просить - ваши вопросы не важнее всех elses. Усильте свой пост и убедитесь, что предложения начинаются с буквы верхнего регистра, и то же самое для «I», когда вы обращаетесь к себе. Не просите поддержки «один на один» с помощью TeamViewer - это занимает гораздо больше времени, чем обычно могут предлагать добровольцы. – halfer

ответ

0

Когда вы делаете datatable.NewRow(), он создается в datatable со значениями по умолчанию для всех столбцов в нем. Он возвращает вновь созданный объект datarow, и вам нужно заполнить столбец соответствующими значениями.

Проблема заключается в том, что у вас есть datatable.NewRow() оператор вне цикла for и datatable.Row.Add вызывается для цикла. Так что в основном вы пытаетесь добавить одну и ту же строку несколько раз.

Вам нужно переместить datatable.NewRow() оператор внутри внутреннего для цикла, который следующим образом.

for (int j = 0; j < Convert.ToInt32(strWorking); j++) 
{ 
    var dr = dttempEmployee.NewRow(); 

    // Other logic 

    dttempEmployee.Rows.Add(dr); 
} 
+0

спасибо. но я застрял в новой проблеме. после некоторых итераций внезапно эта ошибка получила «Нет строки в позиции 2.». эта ошибка возникает в 'if (dtProfileGet.Rows [j] [" hfmiscode "] == DBNull.Value) { dr [" hfmiscode "] =" - "; } ' –

+0

Причина этого заключается в том, что dtProfileGet имеет только 2 строки, и вы пытаетесь получить доступ к третьей строке, выполняя dtProfileGet.Rows [2]. Вам нужно убедиться, что вы не передадите значение больше, чем totalrows-1 в dtProfileGet.Rows –

+0

Дорогой, я не могу найти точную точку ошибки в нем. если я дам u мой идентификатор teamview. пожалуйста, подключитесь и скажите мне вопрос. он был бы очень благодарен. –