0

差し込み印刷を行う必要があるプロジェクトがあり、これを VSTO で実行しています。のすべてのレコードが正常かどうかを確認する必要があり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アクティブなレコードを取得するにはどうすればよいですか?

4

1 に答える 1

1

数時間の調査といくつかの試行の後。データソースのフィールド コレクションは、FirstRecord と Lastrecord を設定するときにポインターを移動しないことを取得します。アクティブ レコードを使用して、WdMailMergeActiveRecord 列挙を使用して、次のように移動する必要があります。

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;
}
于 2013-02-25T17:53:47.260 に答える