private void btnGen_Click(object sender, System.EventArgs e)
        {
            //This program is just an example to show how to use the Framework EDI component in C# 
            //to generate an HIPAA 837 4010 X098 Professional EDI file.

            string sSefFile, sEdiFile, sPath;
            ediDocument oEdiDoc = null;
            ediSchema oSchema = null;
            ediSchemas oSchemas = null;
            ediInterchange oInterchange = null;
            ediGroup oGroup = null;
            ediTransactionSet oTransactionset = null;
            ediDataSegment oSegment = null;

            sPath = AppDomain.CurrentDomain.BaseDirectory;
            sSefFile = "837_X098.SEF";
            sEdiFile = "837_X098_Output.x12";

            oEdiDoc = new ediDocument();

            // Change the cursor type from dynamic to forward to improve speed performance
            oEdiDoc.CursorType = DocumentCursorTypeConstants.Cursor_ForwardWrite;

            // Disable the internal standard reference library to be memory effecient
            oSchemas = oEdiDoc.GetSchemas();
            oSchemas.EnableStandardReference = false;

            // Load the SEF file
            oSchema = oEdiDoc.ImportSchema(sPath + sSefFile, 0);

            // Set termintors
            oEdiDoc.SegmentTerminator ="~{13:10}" ;    //tilde followed by a carraige return line feed
            oEdiDoc.ElementTerminator ="*";
            oEdiDoc.CompositeTerminator =":";

            //CREATES THE ISA SEGMENT
            ediInterchange.Set(ref oInterchange, (ediInterchange) oEdiDoc.CreateInterchange("X","004010"));
            ediDataSegment.Set(ref oSegment, (ediDataSegment) oInterchange.GetDataSegmentHeader());
            oSegment.set_DataElementValue(1,0,"00");     //Authorization Information Qualifier
            oSegment.set_DataElementValue(2,0,"          ");     //Authorization Information
            oSegment.set_DataElementValue(3,0,"00");     //Security Information Qualifier
            oSegment.set_DataElementValue(4,0,"          ");     //Security Information
            oSegment.set_DataElementValue(5,0,"12");     //Interchange ID Qualifier
            oSegment.set_DataElementValue(6,0,"Sender         ");     //Interchange Sender ID
            oSegment.set_DataElementValue(7,0,"12");     //Interchange ID Qualifier
            oSegment.set_DataElementValue(8,0,"ReceiverID     ");     //Interchange Receiver ID
            oSegment.set_DataElementValue(9,0,"010821");     //Interchange Date
            oSegment.set_DataElementValue(10,0,"1548");     //Interchange Time
            oSegment.set_DataElementValue(11,0,"U");     //Interchange Control Standards Identifier
            oSegment.set_DataElementValue(12,0,"00401");     //Interchange Control Version Number
            oSegment.set_DataElementValue(13,0,"000000020");     //Interchange Control Number
            oSegment.set_DataElementValue(14,0,"0");     //Acknowledgment Requested
            oSegment.set_DataElementValue(15,0,"T");     //Usage Indicator
            oSegment.set_DataElementValue(16,0,":");     //Component Element Separator
 
            //CREATES THE GS SEGMENT
            ediGroup.Set(ref oGroup, (ediGroup) oInterchange.CreateGroup("004010X098"));
            ediDataSegment.Set( ref oSegment, (ediDataSegment) oGroup.GetDataSegmentHeader());
            oSegment.set_DataElementValue(1,0,"HC");     //Functional Identifier Code
            oSegment.set_DataElementValue(2,0,"SenderDept");     //Application Sender's Code
            oSegment.set_DataElementValue(3,0,"ReceiverDept");     //Application Receiver's Code
            oSegment.set_DataElementValue(4,0,"20010821");     //Date
            oSegment.set_DataElementValue(5,0,"1548");     //Time
            oSegment.set_DataElementValue(6,0,"1");     //Group Control Number
            oSegment.set_DataElementValue(7,0,"X");     //Responsible Agency Code
            oSegment.set_DataElementValue(8,0,"004010X098");     //Version / Release / Industry Identifier Code
 
            //CREATES THE ST SEGMENT
            ediTransactionSet.Set(ref oTransactionset, (ediTransactionSet) oGroup.CreateTransactionSet("837"));
            ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.GetDataSegmentHeader());
            oSegment.set_DataElementValue(1,0,"837");     //Transaction Set Identifier Code
            oSegment.set_DataElementValue(2,0,"0021");     //Transaction Set Control Number

            //BHT - BEGINNING OF HIERARCHICAL TRANSACTION
            ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("BHT"));
            oSegment.set_DataElementValue(1,0,"0019");     //Hierarchical Structure Code
            oSegment.set_DataElementValue(2,0,"00");     //Transaction Set Purpose Code
            oSegment.set_DataElementValue(3,0,"0123");     //Reference Identification
            oSegment.set_DataElementValue(4,0,"19981015");     //Date
            oSegment.set_DataElementValue(5,0,"1230");     //Time
            oSegment.set_DataElementValue(6,0,"RP");     //Transaction Type Code

            //REF - REFERENCE IDENTIFICATION
            ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("REF"));
            oSegment.set_DataElementValue(1,0,"87");     //Reference Identification Qualifier
            oSegment.set_DataElementValue(2,0,"004010X098");     //Reference Identification
 
            //NM1 - LOOP ID - 1000A SUBMITTER NAME
            ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("NM1\\NM1"));
            oSegment.set_DataElementValue(1,0,"41");     //Entity Identifier Code
            oSegment.set_DataElementValue(2,0,"2");     //Entity Type Qualifier
            oSegment.set_DataElementValue(3,0,"Premier Billing Service");     //Name Last or Organization Name
            oSegment.set_DataElementValue(8,0,"46");     //Identification Code Qualifier
            oSegment.set_DataElementValue(9,0,"TGJ23");     //Identification Code
 
            //PER - ADMINISTRATIVE COMMUNICATIONS CONTACT
            ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("NM1\\PER"));
            oSegment.set_DataElementValue(1,0,"IC");     //Contact Function Code
            oSegment.set_DataElementValue(2,0,"JERRY");     //Name
            oSegment.set_DataElementValue(3,0,"TE");     //Communication Number Qualifier
            oSegment.set_DataElementValue(4,0,"3055552222");     //Communication Number
            oSegment.set_DataElementValue(5,0,"EX");     //Communication Number Qualifier
            oSegment.set_DataElementValue(6,0,"231");     //Communication Number
 
            //NM1 - LOOP ID - 1000B RECEIVER NAME
            ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("NM1\\NM1"));
            oSegment.set_DataElementValue(1,0,"40");     //Entity Identifier Code
            oSegment.set_DataElementValue(2,0,"2");     //Entity Type Qualifier
            oSegment.set_DataElementValue(3,0,"XYZ REPRICER");     //Name Last or Organization Name
            oSegment.set_DataElementValue(8,0,"46");     //Identification Code Qualifier
            oSegment.set_DataElementValue(9,0,"66783JJT");     //Identification Code

            int nHlCounter = 0;
            int nHlSubscriberParent;
            int nHlDependentParent;

            //--------------------------------------------------------------------------------------------------------
            // 2000A BILLING/PAY-TO PROVIDER HL LOOP

            int nProviders = 1;    

            for (int nPrvdrCtr=1; nPrvdrCtr <= nProviders; nPrvdrCtr++)
            {
                nHlCounter = nHlCounter + 1;
                nHlSubscriberParent = nHlCounter;

                //HL - HIERARCHICAL LEVEL
                ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\HL"));
                oSegment.set_DataElementValue(1,0,nHlCounter.ToString());     //Hierarchical ID Number
                oSegment.set_DataElementValue(3,0,"20");     //Hierarchical Level Code
                oSegment.set_DataElementValue(4,0,"1");     //Hierarchical Child Code

                //NM1 - 2010AA BILLING PROVIDER
                ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\NM1\\NM1"));
                oSegment.set_DataElementValue(1,0,"85");     //Entity Identifier Code
                oSegment.set_DataElementValue(2,0,"2");     //Entity Type Qualifier
                oSegment.set_DataElementValue(3,0,"Premier Billing Service");     //Name Last or Organization Name
                oSegment.set_DataElementValue(8,0,"24");     //Identification Code Qualifier
                oSegment.set_DataElementValue(9,0,"587654321");     //Identification Code
 
                //N3 - ADDRESS INFORMATION
                ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\NM1\\N3"));
                oSegment.set_DataElementValue(1,0,"234 Seaway St.");     //Address Information
 
                //N4 - GEOGRAPHIC LOCATION
                ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\NM1\\N4"));
                oSegment.set_DataElementValue(1,0,"Miami");     //City Name
                oSegment.set_DataElementValue(2,0,"FL");     //State or Province Code
                oSegment.set_DataElementValue(3,0,"33111");     //Postal Code
 
                //NM1 - 2010AB PAY-TO PROVIDER
                ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\NM1\\NM1"));
                oSegment.set_DataElementValue(1,0,"87");     //Entity Identifier Code
                oSegment.set_DataElementValue(2,0,"2");     //Entity Type Qualifier
                oSegment.set_DataElementValue(3,0,"Kildare Associates");     //Name Last or Organization Name
                oSegment.set_DataElementValue(8,0,"24");     //Identification Code Qualifier
                oSegment.set_DataElementValue(9,0,"99878-ABA");     //Identification Code
 
                //N3 - ADDRESS INFORMATION
                ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\NM1\\N3"));
                oSegment.set_DataElementValue(1,0,"2345 Ocean Blvd.");     //Address Information
 
                //N4 - GEOGRAPHIC LOCATION
                ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\NM1\\N4"));
                oSegment.set_DataElementValue(1,0,"Miami");     //City Name
                oSegment.set_DataElementValue(2,0,"FL");     //State or Province Code
                oSegment.set_DataElementValue(3,0,"33111");     //Postal Code


                //-------------------------------------------------------------------------------------------------------------
                // 2000B SUBSCRIBER HL LOOP

                int nSubscriberCount = 1;

                for (int nSubscbrCtr=1; nSubscbrCtr <= nSubscriberCount; nSubscbrCtr++)
                {
                    nHlCounter = nHlCounter + 1;
                    nHlDependentParent = nHlCounter;

                    //HL - HIERARCHICAL LEVEL
                    ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\HL"));
                    oSegment.set_DataElementValue(1,0,nHlCounter.ToString());     //Hierarchical ID Number
                    oSegment.set_DataElementValue(2,0,nHlSubscriberParent.ToString());     //Hierarchical Parent ID Number
                    oSegment.set_DataElementValue(3,0,"22");     //Hierarchical Level Code
                    oSegment.set_DataElementValue(4,0,"0");     //Hierarchical Child Code
 
                    //SBR - SUBSCRIBER INFORMATION
                    ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\SBR"));
                    oSegment.set_DataElementValue(1,0,"P");     //Payer Responsibility Sequence Number Code
                    oSegment.set_DataElementValue(2,0,"18");     //Individual Relationship Code
                    oSegment.set_DataElementValue(3,0,"12312-A");     //Reference Identification
                    oSegment.set_DataElementValue(9,0,"HM");     //Claim Filing Indicator Code
 
                    //NM1 - 2010BA SUBSCRIBER
                    ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\NM1\\NM1"));
                    oSegment.set_DataElementValue(1,0,"IL");     //Entity Identifier Code
                    oSegment.set_DataElementValue(2,0,"1");     //Entity Type Qualifier
                    oSegment.set_DataElementValue(3,0,"Smith");     //Name Last or Organization Name
                    oSegment.set_DataElementValue(4,0,"Ted");     //Name First
                    oSegment.set_DataElementValue(8,0,"MI");     //Identification Code Qualifier
                    oSegment.set_DataElementValue(9,0,"000221111");     //Identification Code
 
                    //N3 - ADDRESS INFORMATION
                    ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\NM1\\N3"));
                    oSegment.set_DataElementValue(1,0,"236 N. Main St.");     //Address Information
 
                    //N4 - GEOGRAPHIC LOCATION
                    ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\NM1\\N4"));
                    oSegment.set_DataElementValue(1,0,"Maimi");     //City Name
                    oSegment.set_DataElementValue(2,0,"Fl");     //State or Province Code
                    oSegment.set_DataElementValue(3,0,"33413");     //Postal Code
 
                    //DMG - DEMOGRAPHIC INFORMATION
                    ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\NM1\\DMG"));
                    oSegment.set_DataElementValue(1,0,"D8");     //Date Time Period Format Qualifier
                    oSegment.set_DataElementValue(2,0,"19430501");     //Date Time Period
                    oSegment.set_DataElementValue(3,0,"M");     //Gender Code
 
                    //NM1 - 2010BB SUBSCRIBER/PAYER
                    ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\NM1\\NM1"));
                    oSegment.set_DataElementValue(1,0,"PR");     //Entity Identifier Code
                    oSegment.set_DataElementValue(2,0,"2");     //Entity Type Qualifier
                    oSegment.set_DataElementValue(3,0,"Alliance Health and Life Insurance ");     //Name Last or Organization Name
                    oSegment.set_DataElementValue(8,0,"PI");     //Identification Code Qualifier
                    oSegment.set_DataElementValue(9,0,"741234");     //Identification Code
 
                    //N2 - ADDITIONAL NAME INFORMATION
                    ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\NM1\\N2"));
                    oSegment.set_DataElementValue(1,0,"COMPANY");     //Name


                    //----------------------------------------------------------------------------------------------------
                    // CLM - HEALTH CLAIM -- CLAIM LOOP

                    int nClaimsCount = 1;

                    for (int nClmCtr=1; nClmCtr <= nClaimsCount; nClmCtr++)
                    {
                        //CLM - HEALTH CLAIM
                        ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\CLM\\CLM"));
                        oSegment.set_DataElementValue(1,0,"26462967");     //Claim Submitter's Identifier
                        oSegment.set_DataElementValue(2,0,"100.00");     //Monetary Amount
                        oSegment.set_DataElementValue(5,1,"11");     //Claim Submitter's Identifier
                        oSegment.set_DataElementValue(5,3,"1");     //Claim Filing Indicator Code
                        oSegment.set_DataElementValue(6,0,"Y");     //Yes/No Condition or Response Code
                        oSegment.set_DataElementValue(7,0,"A");     //Provider Accept Assignment Code
                        oSegment.set_DataElementValue(8,0,"Y");     //Yes/No Condition or Response Code
                        oSegment.set_DataElementValue(9,0,"Y");     //Release of Information Code
                        oSegment.set_DataElementValue(10,0,"C");     //Patient Signature Source Code
 
                        //DTP - DATE OR TIME OR PERIOD
                        ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\CLM\\DTP"));
                        oSegment.set_DataElementValue(1,0,"431");     //Date/Time Qualifier
                        oSegment.set_DataElementValue(2,0,"D8");     //Date Time Period Format Qualifier
                        oSegment.set_DataElementValue(3,0,"19981003");     //Date Time Period
 
                        //REF - REFERENCE IDENTIFICATION
                        ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\CLM\\REF"));
                        oSegment.set_DataElementValue(1,0,"D9");     //Reference Identification Qualifier
                        oSegment.set_DataElementValue(2,0,"17312345600006351");     //Reference Identification
 
                        //HI - HEALTH CARE INFORMATION CODES
                        ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\CLM\\HI"));
                        oSegment.set_DataElementValue(1,1,"BK");     //Health Care Code Information
                        oSegment.set_DataElementValue(1,2,"0340");     //Health Care Code Information
                        oSegment.set_DataElementValue(2,1,"BF");     //Health Care Code Information
                        oSegment.set_DataElementValue(2,2,"V7389");     //Health Care Code Information
 
                        //NM1 - INDIVIDUAL OR ORGANIZATIONAL NAME
                        ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\CLM\\NM1\\NM1"));
                        oSegment.set_DataElementValue(1,0,"82");     //Entity Identifier Code
                        oSegment.set_DataElementValue(2,0,"1");     //Entity Type Qualifier
                        oSegment.set_DataElementValue(3,0,"Kildare");     //Name Last or Organization Name
                        oSegment.set_DataElementValue(4,0,"Ben");     //Name First
                        oSegment.set_DataElementValue(8,0,"34");     //Identification Code Qualifier
                        oSegment.set_DataElementValue(9,0,"112233334");     //Identification Code
 
                        //PRV - PROVIDER INFORMATION
                        ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\CLM\\NM1\\PRV"));
                        oSegment.set_DataElementValue(1,0,"PE");     //Provider Code
                        oSegment.set_DataElementValue(2,0,"ZZ");     //Reference Identification Qualifier
                        oSegment.set_DataElementValue(3,0,"203BF0100Y");     //Reference Identification
 
                        //NM1 - INDIVIDUAL OR ORGANIZATIONAL NAME
                        ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\CLM\\NM1\\NM1"));
                        oSegment.set_DataElementValue(1,0,"77");     //Entity Identifier Code
                        oSegment.set_DataElementValue(2,0,"2");     //Entity Type Qualifier
                        oSegment.set_DataElementValue(3,0,"Kildare Associates");     //Name Last or Organization Name
                        oSegment.set_DataElementValue(8,0,"24");     //Identification Code Qualifier
                        oSegment.set_DataElementValue(9,0,"581234567");     //Identification Code
 
                        //N3 - ADDRESS INFORMATION
                        ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\CLM\\NM1\\N3"));
                        oSegment.set_DataElementValue(1,0,"2345 Ocean Blvd.");     //Address Information
 
                        //N4 - GEOGRAPHIC LOCATION
                        ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\CLM\\NM1\\N4"));
                        oSegment.set_DataElementValue(1,0,"Miami");     //City Name
                        oSegment.set_DataElementValue(2,0,"FL");     //State or Province Code
                        oSegment.set_DataElementValue(3,0,"33111");     //Postal Code


                        //----------------------------------------------------------------------------------------------------
                        // LX - 2400 SERVICE LINE LOOP

                        int nServiceLineCount = 4;

                        for (int nSrvLineCtr=1; nSrvLineCtr <= nServiceLineCount; nSrvLineCtr++)
                        {
                            //LX - ASSIGNED NUMBER
                            ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\CLM\\LX\\LX"));
                            oSegment.set_DataElementValue(1,0,nSrvLineCtr.ToString());     //Assigned Number
 
                            //SV1 - PROFESSIONAL SERVICE
                            ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\CLM\\LX\\SV1"));
                            oSegment.set_DataElementValue(1,1,"HC");     //Composite Medical Procedure Identifier
                            oSegment.set_DataElementValue(1,2,"99213");     //Monetary Amount
                            oSegment.set_DataElementValue(2,0,"40.00");     //Monetary Amount
                            oSegment.set_DataElementValue(3,0,"UN");     //Unit or Basis for Measurement Code
                            oSegment.set_DataElementValue(4,0,"1");     //Quantity
                            oSegment.set_DataElementValue(7,1,"1");     //Composite Medical Procedure Identifier
                            oSegment.set_DataElementValue(9,0,"N");     //Yes/No Condition or Response Code
 
                            //DTP - DATE OR TIME OR PERIOD
                            ediDataSegment.Set(ref oSegment, (ediDataSegment) oTransactionset.CreateDataSegment("HL\\CLM\\LX\\DTP"));
                            oSegment.set_DataElementValue(1,0,"472");     //Date/Time Qualifier
                            oSegment.set_DataElementValue(2,0,"D8");     //Date Time Period Format Qualifier
                            oSegment.set_DataElementValue(3,0,"19981003");     //Date Time Period

                        }
                    }              
                }
            }

            // save edi document object to file
            oEdiDoc.Save (sPath + sEdiFile);

            MessageBox.Show("Done. Output = " + sPath + sEdiFile);    

        }

    Click here to download a trial version of the Framework EDI