2016-02-24 5 views
0

Я пытаюсь заполнить DataGridView с динамически генерируемыми DataTable и мне нужно один из колонны, чтобы быть редактируемый TextBoxProgramatically добавить редактируемый TextBox в DataTable - Колонка требует действительного DATATYPE

Это отрывок из моих приложение, которое заполнит вид сетки данных:

public static void PopulatePOLines(MSSQLConnection mssqlConnection, string supplierAccountNumber, DataGridView poLineList) 
{ 
    // Init 
    DataTable dataTable = new DataTable(); 
    DataColumn dataColumn; 
    DataRow dataRow; 
    List<POLine> poLines = new List<POLine>(); 

    // Define sage sku column 
    dataColumn = new DataColumn(); 
    dataColumn.DataType = Type.GetType("System.String"); 
    dataColumn.ColumnName = "sageSku"; 
    dataTable.Columns.Add(dataColumn); 

    // Define required quantity column 
    dataColumn = new DataColumn(); 
    dataColumn.DataType = Type.GetType("System.Int32"); 
    dataColumn.ColumnName = "requiredQuantity"; 
    dataTable.Columns.Add(dataColumn); 

    // Define on pop quantity column 
    dataColumn = new DataColumn(); 
    dataColumn.DataType = Type.GetType("System.Int32"); 
    dataColumn.ColumnName = "onPOPQuantity"; 
    dataTable.Columns.Add(dataColumn); 

    // Define order quantity column 
    dataColumn = new DataColumn(); 
    dataColumn.DataType = Type.GetType("System.Windows.Forms.TextBox"); 
    dataColumn.ColumnName = "orderQuantity"; 
    dataTable.Columns.Add(dataColumn); 

    // Consolidate & populate po lines from failed allocations by supplier from db 
    try 
    { 
     // Query database 
     List<Dictionary<string, object>> results = mssqlConnection.ExecuteReader(
      "... snipped...", 
      new Dictionary<string, object>() 
      { 
       { "SupplierAccountNumber", supplierAccountNumber } 
      }); 

     // Parse result 
     foreach (Dictionary<string, object> dbRow in results) 
     { 
      // Parse row field value 
      var sageSku = dbRow["SageSku"].ToString(); 
      var quantity = Convert.ToInt32(dbRow["Quantity"]); 

      // Check if this failed allocation line is known 
      var poLine = poLines.Find(s => s.SageSku == sageSku); 

      // If this line isn't known 
      if (null == poLine) 
      { 
       // Workout quantity on pop for this sage sku 
       var onPOPQty = mssqlConnection.ExecuteScalar<int>(
        "... snipped...", 
        new Dictionary<string, object>() 
        { 
         { "SageSku", sageSku } 
        }); 

       // Insert a new record 
       poLines.Add(new POLine() 
       { 
        SageSku = sageSku, 
        RequiredQty = quantity, 
        OnPOPQty = onPOPQty 
       }); 
      } 
      else 
      { 
       // Update existing record 
       poLine.RequiredQty += quantity; 
      } 

      // Clean-up 
      sageSku = null; 
     } 

     // Clean-up 
     results = null; 

     // Iterate through po lines 
     foreach (POLine poLine in poLines) 
     { 
      dataRow = dataTable.NewRow(); 
      dataRow["sageSku"] = poLine.SageSku; 
      dataRow["requiredQuantity"] = poLine.RequiredQty; 
      dataRow["onPOPQuantity"] = poLine.OnPOPQty; 
      dataRow["orderQuantity"] = (poLine.OnPOPQty > poLine.RequiredQty ? 0 : (poLine.RequiredQty - poLine.OnPOPQty)); 
      dataTable.Rows.Add(dataRow); 
     } 
    } 
    catch (Exception ex) 
    { 
     ShowError("Failed to consolidate & populate purchase order lines by selected supplier.", ex); 
    } 

    // Set data source 
    poLineList.DataSource = new DataView(dataTable); 

    // Clean-up 
    dataTable = null; 
    dataColumn = null; 
    dataRow = null; 
    poLines = null; 

    // Update column header text 
    poLineList.Columns[0].HeaderText = "Sage Sku"; 
    poLineList.Columns[1].HeaderText = "Required Qty"; 
    poLineList.Columns[2].HeaderText = "On POP Qty"; 
    poLineList.Columns[3].HeaderText = "Suggested Order Qty"; 
} 

При выполнении этого кода, я получаю следующее сообщение об ошибке:

Column requires a valid DataType.

Что я здесь делаю неправильно?

Если я установил orderQuantity колонки DataType к System.Int32, то DataGrid зрения правильно делает с моими данными, но это не редактируется:

enter image description here

Любые идеи, как я могу решить эту проблему?

+0

Свойство DataType DataColumn не поддерживает тип данных System.Windows.Forms.TextBox. Я немного озадачен сообщением об ошибке, но это окончательно не является хорошим значением. – Steve

+0

Есть ли альтернативный способ создания редактируемого поля, если 'System.Windows.Forms.TextBox' не поддерживается? – Latheesan

+1

_DataGridView.Columns [x] .ReadOnly = false; _ – Steve

ответ

0

As indicated in the MSDN, DataColumn.DataType поддерживает только определенный набор типов данных (в основном примитивных типов, но есть несколько исключений). К сожалению, вы не сможете добавить TextBox прямо так.

Однако, вы изучили DataGridViewTextBoxColumn Class? Вы должны создать свой столбец как экземпляр этого класса вместо обычного столбца, заполненного TextBox.

Возможно также создание шаблона DataGridView и наличие нужного столбца в этом классе (вы можете определить столбцы из проектного представления), оставив остальные столбцы пустых оболочек, которые вы заполняете в своем коде ,

1

Я решил это.

Я сохранил тип данных как System.Int32, а затем в визуальном конструкторе, я нажал DataGridView и тикали Enable Editing, а затем в коде, который заполняет источник данных, я добавил следующее в конце:

// Disallow editting on certain columns 
poLineList.Columns[0].ReadOnly = true; 
poLineList.Columns[1].ReadOnly = true; 
poLineList.Columns[2].ReadOnly = true; 

У меня есть 4 столбца на моей сетке, поэтому приведенные выше будут делать первые три как только для чтения, а другие столбцы редактируемые, что является только четвертым столбцом (который я хотел редактировать).

Thanks Steve.

0

Если установить DATATYPE столбца orderQuantity к System.Int32, то DataGrid зрения правильно делает с моими данными, но это не редактируется:

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

+0

https: //editor.datatables.net/examples/inline-editing/simple Эта ссылка может помочь –

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