2013-02-19 41 views
0

我有一個項目,需要做一個mailmerge,我正在執行此與VSTO。我需要檢查MailMerge.DataSource.DataFields上的所有記錄是否正常。我正在用這個代碼做這件事。mailmerge與visto如何獲得MailMerge.DataSource.DataFields的每個記錄

public void verificarPersonas(Word.Document Doc) 
    { 
     ThisAddIn ThisAddIn = Globals.ThisAddIn; 
     List<Personas> miListaPersonas = new List<Personas>(); 
     decimal nRecords = Doc.MailMerge.DataSource.RecordCount; 
     if (nRecords == 0) 
     { 
      cambiarEstado("Empty db or documento does'n prepared for mail merge", false); 
     } 
     else 
     { 
      string fieldIdentificacion = persParm("Identificacion"); 
      string fieldNombre = persParm("Nombres"); 
      string fieldApellido = persParm("Apellidos"); 
      string fieldEmail = persParm("Email"); 
      string fieldDireccion = persParm("Direccion"); 
      string fieldTelefono = persParm("Telefono"); 

      if (String.IsNullOrEmpty(fieldIdentificacion) || String.IsNullOrEmpty(fieldNombre)) 
      { 
       cambiarEstado("", false); 
       return; 
      } 
      else 
      { 
       for (int i = 1; i <= nRecords; i++) 
       { 
        Doc.MailMerge.DataSource.FirstRecord = i; 
        Doc.MailMerge.DataSource.LastRecord = i; 

        // Here Allways get the first record 
        dynamic fields = Doc.MailMerge.DataSource.DataFields; 
        // ________________________________ 
        Personas personaActual = new Personas(); 
        personaActual.IdPersona = 0; 
        try 
        { 
         personaActual.Identificacion = fields(fieldIdentificacion).value; 
         personaActual.Nombres = fields(fieldNombre).value; 
         personaActual.Apellidos = (String.IsNullOrEmpty(fieldApellido) ? "" : fields(fieldApellido).value); 
         personaActual.Email = (String.IsNullOrEmpty(fieldEmail) ? "" : fields(fieldEmail).value); 
         personaActual.Direccion = (String.IsNullOrEmpty(fieldDireccion) ? "" : fields(fieldDireccion).value); 
         personaActual.Telefono = (String.IsNullOrEmpty(fieldTelefono) ? "" : fields(fieldTelefono).value); 

         miListaPersonas.Add(personaActual); 
        } 
        catch (Exception e) 
        { 
         cambiarEstado(""+e.Message, false); 
         return; 
        } 
       } 

       string listaPersonasJson = JsonConvert.SerializeObject(miListaPersonas); 
       string respuesta = wt.getWebData("Personas", "verificarPersonasVSTO", new { personas = listaPersonasJson }); 

      } 
     } 
    } 

我的問題是,dynamic fields = Doc.MailMerge.DataSource.DataFields;總是得到第一個記錄。

如何才能獲得datafields的活動記錄?

回答

1

經過幾個小時的研究和一些嘗試。獲取數據源的字段集合不,當你設置FirstRecord和Lastrecord,它必須使用activerecords使用WdMailMergeActiveRecord枚舉移動,sonething這樣移動指針:

int nRecords = Doc.MailMerge.DataSource.RecordCount; 

for (int i = 1; i <= nRecords; i++) 
{ 
    Doc.MailMerge.DataSource.FirstRecord = i; //It doesn't work 
    Doc.MailMerge.DataSource.LastRecord = i; // it doesn't work 
    Doc.MailMerge.DataSource.ActiveRecord = (i == 1 ? 
    Word.WdMailMergeActiveRecord.wdFirstDataSourceRecord :Word.WdMailMergeActiveRecord.wdNextDataSourceRecord); 
    Doc.MailMerge.DataSource.ActiveRecord = (i == nRecords ? Word.WdMailMergeActiveRecord.wdLastDataSourceRecord : Doc.MailMerge.DataSource.ActiveRecord); 
    dynamic fields = Doc.MailMerge.DataSource.DataFields; 
}