public ActionResult AddNewSegmentValue(int segmentID, string newValue)
        {
            int newValueID = 0;

            using (var client = OltpLogicClient.Open(AppState.SessionID))
            {
                if (client == null)
                {
                    return(PartialView("~/Views/Shared/_SessionExpiredView.cshtml"));
                }

                Oltp.SegmentValueDataTable t = client.Service.SegmentValue_Get(acc_id, segmentID);
                Oltp.SegmentValueRow       r = t.NewSegmentValueRow();
                r.AccountID = acc_id;
                r.SegmentID = segmentID;
                r.Value     = newValue;
                t.AddSegmentValueRow(r);

                Oltp.SegmentValueDataTable t2 = client.Service.SegmentValue_Save(t);

                Dictionary <int, string> oldcollection = t.ToDictionary(z => z.ValueID, z => z.Value);
                Dictionary <int, string> newcollection = t2.ToDictionary(z => z.ValueID, z => z.Value);

                newValueID = newcollection.Where(n => !oldcollection.ContainsKey(n.Key)).First().Key;
            }

            return(Content(newValueID.ToString()));
        }
コード例 #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public override void OnAccountChanged()
        {
            Oltp.AccountRow value = Window.CurrentAccount;

            //..............................
            // Segments
            _tabSegmentsInitialized = false;
            _segmentValueTables     = new Dictionary <Oltp.SegmentRow, Oltp.SegmentValueDataTable>();

            Window.AsyncOperation(delegate()
            {
                using (OltpProxy proxy = new OltpProxy())
                {
                    _segmentTable = proxy.Service.Segment_Get(value.ID, false);
                    foreach (Oltp.SegmentRow segment in _segmentTable.Rows)
                    {
                        Oltp.SegmentValueDataTable values = proxy.Service.SegmentValue_Get(value.ID, segment.SegmentID);
                        Oltp.SegmentValueRow defaultRow   = values.NewSegmentValueRow();
                        defaultRow.AccountID = value.ID;
                        defaultRow.SegmentID = segment.SegmentID;
                        defaultRow.ValueID   = -1;
                        defaultRow.Value     = "(none)";
                        values.Rows.InsertAt(defaultRow, 0);
                        values.AcceptChanges();
                        _segmentValueTables.Add(segment, values);
                    }
                }
            },
                                  delegate()
            {
                GetCreatives(value, null, false);
            });
        }
        public ActionResult Index(int account, string session)
        {
            AppState.AccountID = account;
            AppState.SessionID = session == "" ? null : "";

            acc_id     = AppState.AccountID;
            session_id = AppState.SessionID;

            Models.TrackersListModel m = new Models.TrackersListModel();

            using (var client = new OltpLogicClient(session_id))
            {
                // Load Channels
                Oltp.ChannelDataTable channels = client.Service.Channel_Get();
                m.Channels = channels.OrderBy(x => x.DisplayName).ToDictionary(c => c.ID, c => c.DisplayName);

                // Load Segments
                Oltp.SegmentDataTable segments = client.Service.Segment_Get(acc_id, true);

                foreach (Oltp.SegmentRow segment in segments)
                {
                    bool is_tracker_segment = ((Auxilary.SegmentAssociationFlags)segment.Association).HasFlag(Auxilary.SegmentAssociationFlags.Gateyway);
                    if (is_tracker_segment)
                    {
                        Oltp.SegmentValueDataTable segment_values = client.Service.SegmentValue_Get(acc_id, segment.SegmentID);
                        m.Segments.Add(new Models.SegmentRowModel()
                        {
                            SegmentRow = segment, Values = segment_values.ToList()
                        });
                    }
                }
            }
            return(View(m));
        }
        public PartialViewResult BatchUpdate()
        {
            Models.TrackersBatchModel m = new Models.TrackersBatchModel();

            using (var client = new OltpLogicClient(session_id))
            {
                Oltp.SegmentDataTable segments = client.Service.Segment_Get(acc_id, true);
                foreach (Oltp.SegmentRow segment in segments)
                {
                    bool is_tracker_segment = ((Auxilary.SegmentAssociationFlags)segment.Association).HasFlag(Auxilary.SegmentAssociationFlags.Gateyway);
                    if (is_tracker_segment)
                    {
                        Oltp.SegmentValueDataTable segment_values = client.Service.SegmentValue_Get(acc_id, segment.SegmentID);
                        m.Segments.Add(new Models.SegmentRowModel()
                        {
                            SegmentRow = segment, Values = segment_values.ToList(), SelectedValue = -1
                        });
                    }
                }
                Oltp.ChannelDataTable channels = client.Service.Channel_Get();
                m.Channels     = channels.ToDictionary(c => c.ID, c => c.DisplayName);
                m.LandingPages = client.Service.Page_Get(acc_id, null, true, -1).ToDictionary(p => p.GK, p => p.DisplayName);
            }


            return(PartialView("BatchTrackers", m));
        }
コード例 #5
0
        /*=========================*/
        #endregion

        #region Segment Values
        /*=========================*/

        /// <summary>
        ///
        /// </summary>
        private void SegmentValue_TabGotFocus(object sender, RoutedEventArgs e)
        {
            if (_segmentValuesListTable.ListView.ItemsSource == null)
            {
                Oltp.SegmentRow segment = Segment_dialog.Content as Oltp.SegmentRow;
                Window.AsyncOperation(delegate()
                {
                    if (segment.RowState != DataRowState.Added)
                    {
                        using (OltpProxy proxy = new OltpProxy())
                        {
                            _segmentValuesTable = proxy.Service.SegmentValue_Get(Window.CurrentAccount.ID, segment.SegmentID);
                        }
                    }
                    else
                    {
                        _segmentValuesTable = new Oltp.SegmentValueDataTable();
                    }
                },
                                      delegate()
                {
                    SetListSource <DataRow>(_segmentValuesTable, _segmentValuesListTable.ListView);
                });
            }
        }
コード例 #6
0
        /// <summary>
        ///
        /// </summary>
        private void Segment_dialog_Closing(object sender, CancelRoutedEventArgs e)
        {
            if (_segmentValuesTable != null && _segmentValuesTable.GetChanges() != null)
            {
                MessageBoxResult result = MessageBox.Show(
                    "Discard changes?",
                    "Confirm",
                    MessageBoxButton.OKCancel,
                    MessageBoxImage.Warning,
                    MessageBoxResult.Cancel);

                if (result == MessageBoxResult.Cancel)
                {
                    e.Cancel = true;
                }
            }

            // Cancel if user regrets
            if (!e.Cancel)
            {
                e.Cancel = MainWindow.MessageBoxPromptForCancel(Segment_dialog);
            }

            if (e.Cancel)
            {
                return;
            }

            _segments.RejectChanges();
            _segmentValuesTable = null;
            _segmentValuesListTable.ListView.ItemsSource = null;
        }
        public ActionResult EditCreative(long creativeGK)
        {
            Models.CreativeModel m = new Models.CreativeModel();

            using (var client = new OltpLogicClient(session_id))
            {
                Oltp.CreativeRow creative = client.Service.Creative_GetSingle(creativeGK)[0];
                //client.Service.Creative_Get(
                m.Creative = creative;

                Oltp.SegmentDataTable segments = client.Service.Segment_Get(acc_id, false);

                foreach (Oltp.SegmentRow r in segments)
                {
                    bool is_creative_segment = ((Auxilary.SegmentAssociationFlags)r.Association).HasFlag(Auxilary.SegmentAssociationFlags.Creative);
                    if (is_creative_segment)
                    {
                        Oltp.SegmentValueDataTable values = client.Service.SegmentValue_Get(acc_id, r.SegmentID);
                        int value;
                        switch (r.SegmentID)
                        {
                        case 1: value = creative.Segment1; break;

                        case 2: value = creative.Segment2; break;

                        case 3: value = creative.Segment3; break;

                        case 4: value = creative.Segment4; break;

                        case 5: value = creative.Segment5; break;

                        default: value = creative.Segment1; break;
                        }


                        m.Segments.Add(new Models.SegmentRowModel()
                        {
                            SegmentRow = r, Values = values.ToList(), SelectedValue = value
                        });
                    }
                }

                Oltp.AdgroupDataTable creative_adgroups = client.Service.Adgroup_GetByCreative(creativeGK);
                Dictionary <int, Oltp.CampaignRow> campaings_dictionaty = client.Service.Campaign_GetIndividualCampaigns(creative_adgroups.Select(f => f.CampaignGK).ToArray()).ToDictionary(f => f.GK, f => f);

                foreach (Oltp.AdgroupRow r in creative_adgroups)
                {
                    m.Associations.Add(new Models.AssociationRowModel()
                    {
                        AdGroup = r, Campaign = campaings_dictionaty[(int)r.CampaignGK]
                    });
                }

                m.Creative = creative;
            }

            return(PartialView("~/Views/Creatives/CreativeDetails.cshtml", m));
        }
コード例 #8
0
        public PartialViewResult EditMultipleAdgroups(string adgroupsGK)
        {
            Oltp.AdgroupDataTable adgroups;
            List <long>           AdgroupsGK = adgroupsGK.Split(',').Select(s => s.Length > 0 ? long.Parse(s) : 0).ToList();

            Models.MultipleAdgroupModel m = new Models.MultipleAdgroupModel();
            m.AdgroupsGK = adgroupsGK;

            using (var client = OltpLogicClient.Open(session_id))
            {
                if (client == null)
                {
                    return(PartialView("~/Views/Shared/_SessionExpiredView.cshtml"));
                }

                foreach (long adgroupGK in AdgroupsGK)
                {
                    Oltp.AdgroupDataTable t = client.Service.Adgroup_GetSingle(adgroupGK);
                    if (t.Count > 0)
                    {
                        m.Adgroups.Add(t[0]);
                    }
                }


                Oltp.SegmentDataTable segments = client.Service.Segment_Get(acc_id, true);
                foreach (Oltp.SegmentRow segment in segments)
                {
                    bool is_adgroup_segment = ((Auxilary.SegmentAssociationFlags)segment.Association).HasFlag(Auxilary.SegmentAssociationFlags.Adgroup);
                    if (is_adgroup_segment)
                    {
                        Oltp.SegmentValueDataTable segment_values = client.Service.SegmentValue_Get(acc_id, segment.SegmentID);
                        int value;
                        switch (segment.SegmentID)
                        {
                        case 1: value = GetCommonValue(m.Adgroups.Select(x => x.Segment1).ToList()); break;

                        case 2: value = GetCommonValue(m.Adgroups.Select(x => x.Segment2).ToList()); break;

                        case 3: value = GetCommonValue(m.Adgroups.Select(x => x.Segment3).ToList()); break;

                        case 4: value = GetCommonValue(m.Adgroups.Select(x => x.Segment4).ToList()); break;

                        case 5: value = GetCommonValue(m.Adgroups.Select(x => x.Segment5).ToList()); break;

                        default: value = GetCommonValue(m.Adgroups.Select(x => x.Segment1).ToList()); break;
                        }
                        m.Segments.Add(new Models.SegmentRowModel()
                        {
                            SegmentRow = segment, Values = segment_values.ToList(), SelectedValue = value
                        });
                    }
                }
            }

            return(PartialView("MultipleAdgroupDetails", m));
        }
        public ActionResult EditMultipleCreatives(string creativesGK)
        {
            List <long> CreativesGK = creativesGK.Split(',').Select(s => s.Length > 0 ? long.Parse(s) : 0).ToList();

            Models.MutliCreativeModel m = new Models.MutliCreativeModel();
            m.CreativesGK = creativesGK;

            using (var client = OltpLogicClient.Open(session_id))
            {
                if (client == null)
                {
                    return(PartialView("~/Views/Shared/_SessionExpiredView.cshtml"));
                }

                foreach (long creativeGK in CreativesGK)
                {
                    Oltp.CreativeDataTable t = client.Service.Creative_GetSingle(creativeGK);
                    if (t.Count > 0)
                    {
                        m.Creatives.Add(t[0]);
                    }
                }

                Oltp.SegmentDataTable segments = client.Service.Segment_Get(acc_id, false);

                foreach (Oltp.SegmentRow r in segments)
                {
                    bool is_creative_segment = ((Auxilary.SegmentAssociationFlags)r.Association).HasFlag(Auxilary.SegmentAssociationFlags.Creative);
                    if (is_creative_segment)
                    {
                        Oltp.SegmentValueDataTable values = client.Service.SegmentValue_Get(acc_id, r.SegmentID);
                        int value;
                        switch (r.SegmentID)
                        {
                        case 1: value = GetCommonValue(m.Creatives.Select(x => x.Segment1).ToList()); break;

                        case 2: value = GetCommonValue(m.Creatives.Select(x => x.Segment2).ToList()); break;

                        case 3: value = GetCommonValue(m.Creatives.Select(x => x.Segment3).ToList()); break;

                        case 4: value = GetCommonValue(m.Creatives.Select(x => x.Segment4).ToList()); break;

                        case 5: value = GetCommonValue(m.Creatives.Select(x => x.Segment5).ToList()); break;

                        default: value = GetCommonValue(m.Creatives.Select(x => x.Segment1).ToList()); break;
                        }

                        m.Segments.Add(new Models.SegmentRowModel()
                        {
                            SegmentRow = r, Values = values.ToList(), SelectedValue = value
                        });
                    }
                }
            }

            return(PartialView("MultiCreativeDetails", m));
        }
コード例 #10
0
        public PartialViewResult EditCampaign(long campaignGK)
        {
            Models.CampaignModel m = new Models.CampaignModel();

            using (var client = OltpLogicClient.Open(session_id))
            {
                if (client == null)
                {
                    return(PartialView("~/Views/Shared/_SessionExpiredView.cshtml"));
                }

                m.Campaign = client.Service.Campaign_GetSingle(campaignGK)[0];


                Oltp.SegmentDataTable segments = client.Service.Segment_Get(acc_id, true);
                foreach (Oltp.SegmentRow segment in segments)
                {
                    bool is_campaign_segment = ((Auxilary.SegmentAssociationFlags)segment.Association).HasFlag(Auxilary.SegmentAssociationFlags.Campaign);
                    if (is_campaign_segment)
                    {
                        Oltp.SegmentValueDataTable segment_values = client.Service.SegmentValue_Get(acc_id, segment.SegmentID);
                        int value;
                        switch (segment.SegmentID)
                        {
                        case 1: value = m.Campaign.Segment1; break;

                        case 2: value = m.Campaign.Segment2; break;

                        case 3: value = m.Campaign.Segment3; break;

                        case 4: value = m.Campaign.Segment4; break;

                        case 5: value = m.Campaign.Segment5; break;

                        default: value = m.Campaign.Segment1; break;
                        }
                        m.Segments.Add(new Models.SegmentRowModel()
                        {
                            SegmentRow = segment, Values = segment_values.ToList(), SelectedValue = value
                        });
                    }
                }

                DataTable t = client.Service.CampaignTargets_Get(acc_id, campaignGK);
                if (t.Rows.Count > 0)
                {
                    m.Target_Customer  = t.Rows[0]["CPA_new_users"] == DBNull.Value ? null : (double?)t.Rows[0]["CPA_new_users"];
                    m.Target_Depositor = t.Rows[0]["CPA_new_activations"] == DBNull.Value ? null : (double?)t.Rows[0]["CPA_new_activations"];
                }
            }


            return(PartialView("CampaignDetails", m));
        }
        public PartialViewResult EditTracker(string identifier)
        {
            Models.TrackerModel m = new Models.TrackerModel();

            using (var client = OltpLogicClient.Open(session_id))
            {
                if (client == null)
                {
                    return(PartialView("~/Views/Shared/_SessionExpiredView.cshtml"));
                }

                m.Tracker = client.Service.Gateway_GetByIdentifier(acc_id, identifier)[0];

                Oltp.SegmentDataTable segments = client.Service.Segment_Get(acc_id, true);
                foreach (Oltp.SegmentRow segment in segments)
                {
                    bool is_tracker_segment = ((Auxilary.SegmentAssociationFlags)segment.Association).HasFlag(Auxilary.SegmentAssociationFlags.Gateyway);
                    if (is_tracker_segment)
                    {
                        Oltp.SegmentValueDataTable segment_values = client.Service.SegmentValue_Get(acc_id, segment.SegmentID);
                        int value;
                        switch (segment.SegmentID)
                        {
                        case 1: value = m.Tracker.Segment1; break;

                        case 2: value = m.Tracker.Segment2; break;

                        case 3: value = m.Tracker.Segment3; break;

                        case 4: value = m.Tracker.Segment4; break;

                        case 5: value = m.Tracker.Segment5; break;

                        default: value = m.Tracker.Segment1; break;
                        }
                        m.Segments.Add(new Models.SegmentRowModel()
                        {
                            SegmentRow = segment, Values = segment_values.ToList(), SelectedValue = value
                        });
                    }
                }
                Oltp.ChannelDataTable channels = client.Service.Channel_Get();
                m.Channels     = channels.ToDictionary(c => c.ID, c => c.DisplayName);
                m.LandingPages = client.Service.Page_Get(acc_id, null, true, -1).ToDictionary(p => p.GK, p => p.DisplayName);
                m.AppliedTo    = GetReferenceData(m.Tracker, client);
            }


            return(PartialView("TrackerDetails", m));
        }
コード例 #12
0
        public ActionResult EditMultipleCampaign(string campaignsGK)
        {
            List <long> CampaingsGK = campaignsGK.Split(',').Select(s => s.Length > 0 ? long.Parse(s) : 0).ToList();

            Models.MultiCampaignModel m = new Models.MultiCampaignModel();
            m.CampaignsGK = campaignsGK;
            using (var client = OltpLogicClient.Open(session_id))
            {
                if (client == null)
                {
                    return(PartialView("~/Views/Shared/_SessionExpiredView.cshtml"));
                }

                m.Campaigns = client.Service.Campaign_GetIndividualCampaigns(CampaingsGK.ToArray()).ToList();

                Oltp.SegmentDataTable segments = client.Service.Segment_Get(acc_id, true);
                foreach (Oltp.SegmentRow segment in segments)
                {
                    bool is_campaign_segment = ((Auxilary.SegmentAssociationFlags)segment.Association).HasFlag(Auxilary.SegmentAssociationFlags.Campaign);
                    if (is_campaign_segment)
                    {
                        Oltp.SegmentValueDataTable segment_values = client.Service.SegmentValue_Get(acc_id, segment.SegmentID);
                        int value;
                        switch (segment.SegmentID)
                        {
                        case 1: value = GetCommonValue(m.Campaigns.Select(x => x.Segment1).ToList()); break;

                        case 2: value = GetCommonValue(m.Campaigns.Select(x => x.Segment2).ToList()); break;

                        case 3: value = GetCommonValue(m.Campaigns.Select(x => x.Segment3).ToList()); break;

                        case 4: value = GetCommonValue(m.Campaigns.Select(x => x.Segment4).ToList()); break;

                        case 5: value = GetCommonValue(m.Campaigns.Select(x => x.Segment5).ToList()); break;

                        default: value = GetCommonValue(m.Campaigns.Select(x => x.Segment1).ToList()); break;
                        }
                        m.Segments.Add(new Models.SegmentRowModel()
                        {
                            SegmentRow = segment, Values = segment_values.ToList(), SelectedValue = value
                        });
                    }
                }
            }


            return(PartialView("MultiCampaignDetails", m));
        }
コード例 #13
0
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            ValidationResult result = base.Validate(value, cultureInfo);

            if (!result.IsValid)
            {
                return(result);
            }

            var valueText = (string)value;

            if (valueText.Trim().Length != valueText.Length)
            {
                return(new ValidationResult(false, "Value cannot start or end with whitespace."));
            }

            var page = MainWindow.Current.CurrentPage as SegmentsPage;

            if (page == null)
            {
                return(new ValidationResult(true, null));
            }

            Oltp.SegmentValueDataTable values = page._segmentValuesTable;

            DataRow[] rows = values.Select(String.Format("{0} = '{1}'",
                                                         values.ValueColumn.ColumnName,
                                                         valueText.Trim().Replace("'", "''")));

            bool self = rows.Length == 1 && rows[0] == this.Row;

            if (!self && rows.Length > 0)
            {
                result = new ValidationResult(false, "This value is already defined.");
            }

            return(result);
        }
コード例 #14
0
        public PartialViewResult EditAdgroup(long adgroupGK)
        {
            Models.AdgroupModel m = new Models.AdgroupModel();

            using (var client = OltpLogicClient.Open(session_id))
            {
                if (client == null)
                {
                    return(PartialView("~/Views/Shared/_SessionExpiredView.cshtml"));
                }

                m.Adgroup = client.Service.Adgroup_GetSingle(adgroupGK)[0];


                Oltp.SegmentDataTable segments = client.Service.Segment_Get(acc_id, true);
                foreach (Oltp.SegmentRow segment in segments)
                {
                    bool is_adgroup_segment = ((Auxilary.SegmentAssociationFlags)segment.Association).HasFlag(Auxilary.SegmentAssociationFlags.Adgroup);
                    if (is_adgroup_segment)
                    {
                        Oltp.SegmentValueDataTable segment_values = client.Service.SegmentValue_Get(acc_id, segment.SegmentID);
                        int value;
                        switch (segment.SegmentID)
                        {
                        case 1: value = m.Adgroup.Segment1; break;

                        case 2: value = m.Adgroup.Segment2; break;

                        case 3: value = m.Adgroup.Segment3; break;

                        case 4: value = m.Adgroup.Segment4; break;

                        case 5: value = m.Adgroup.Segment5; break;

                        default: value = m.Adgroup.Segment1; break;
                        }
                        m.Segments.Add(new Models.SegmentRowModel()
                        {
                            SegmentRow = segment, Values = segment_values.ToList(), SelectedValue = value
                        });
                    }
                }

                Oltp.AdgroupKeywordDataTable k = client.Service.AdgroupKeyword_Get(adgroupGK);
                foreach (Oltp.AdgroupKeywordRow r in k)
                {
                    Models.AdgroupKeywordModel m1 = new Models.AdgroupKeywordModel();
                    m1.DestinationURL = r.DestinationUrlDisplay;
                    m1.KeywordGK      = r.KeywordGK;
                    m1.KeywordName    = r.KeywordDisplay;
                    m1.MatchType      = r.MatchTypeDisplay;
                    m.Keywords.Add(m1);
                }

                Oltp.AdgroupCreativeDataTable c = client.Service.AdgroupCreative_Get(adgroupGK);
                foreach (Oltp.AdgroupCreativeRow r in c)
                {
                    Models.AdgroupCreativeModel m1 = new Models.AdgroupCreativeModel();
                    m1.AdgroupCreativeGK = r.AdgroupCreativeGK;
                    m1.CreativeGK        = r.CreativeGK;
                    m1.Desc1             = r.Desc1;
                    m1.Desc2             = r.Desc2;
                    m1.DestinationURL    = r.DestinationURL;
                    m1.DisplayURL        = r.DisplayURL;
                    m1.Title             = r.Title;

                    foreach (Oltp.SegmentRow segment in segments)
                    {
                        bool is_adgroupcreative_segment = ((Auxilary.SegmentAssociationFlags)segment.Association).HasFlag(Auxilary.SegmentAssociationFlags.AdgroupCreative);
                        if (is_adgroupcreative_segment)
                        {
                            Oltp.SegmentValueDataTable segment_values = client.Service.SegmentValue_Get(acc_id, segment.SegmentID);
                            long value;
                            switch (segment.SegmentID)
                            {
                            case 1: value = r.Segment1; break;

                            case 2: value = r.Segment2; break;

                            case 3: value = r.Segment3; break;

                            case 4: value = r.Segment4; break;

                            case 5: value = r.Segment5; break;

                            case 999: value = r.PageGK; break;

                            default: value = r.Segment1; break;
                            }
                            m1.Segments.Add(new Models.SegmentRowModel()
                            {
                                SegmentRow = segment, Values = segment_values.ToList(), SelectedValue = value
                            });
                        }
                    }

                    m.Creatives.Add(m1);
                }
            }


            return(PartialView("AdgroupDetails", m));
        }
コード例 #15
0
        /// <summary>
        ///
        /// </summary>
        private void Segment_dialog_ApplyingChanges(object sender, CancelRoutedEventArgs e)
        {
            Oltp.SegmentRow editVersion = Segment_dialog.Content as Oltp.SegmentRow;
            bool            isNew       = editVersion.RowState == DataRowState.Added;

            if (IsMissingData(isNew, _segmentValuesTable))
            {
                MainWindow.MessageBoxError("At least one value is required for a segment.", null);
                e.Cancel = true;
                return;
            }

            List <TextBox> textboxes = VisualTree.GetChildren <TextBox>(_segmentValuesListTable);

            foreach (TextBox textbox in textboxes)
            {
                if (Validation.GetHasError(textbox))
                {
                    MainWindow.MessageBoxError("You have one or more errors. Please correct them before continuing.", null);
                    e.Cancel = true;
                    return;
                }
            }

            Dialog_ApplyingChanges <Oltp.SegmentDataTable, Oltp.SegmentRow>(
                _segments,
                Segment_dialog,
                typeof(IOltpLogic).GetMethod("Segment_Save"),
                e,
                null,
                true,
                delegate()
            {
                if (e.Cancel)
                {
                    return;
                }

                if (_segmentValuesTable == null || _segmentValuesTable.GetChanges() == null)
                {
                    Segment_dialog.EndApplyChanges(e);
                    return;
                }

                ObservableCollection <DataRow> source =
                    _segmentValuesListTable.ListView.ItemsSource as ObservableCollection <DataRow>;

                for (int i = 0; i < source.Count; i++)
                {
                    if (source[i].RowState != DataRowState.Added)
                    {
                        continue;
                    }

                    (source[i] as Oltp.SegmentValueRow).AccountID = Window.CurrentAccount.ID;
                    (source[i] as Oltp.SegmentValueRow).SegmentID = (Segment_dialog.TargetContent as Oltp.SegmentRow).SegmentID;
                }

                // Save -- async
                Window.AsyncOperation(delegate()
                {
                    using (OltpProxy proxy = new OltpProxy())
                    {
                        Oltp.SegmentValueDataTable returnedTable = proxy.Service.SegmentValue_Save(_segmentValuesTable);
                        if (returnedTable != null)
                        {
                            _segmentValuesTable = returnedTable;
                        }
                        else
                        {
                            _segmentValuesTable.AcceptChanges();
                        }
                    }
                },
                                      delegate(Exception ex)
                {
                    MainWindow.MessageBoxError("Failed to save segment values.", ex);
                    e.Cancel = true;
                    return(false);
                },
                                      delegate()
                {
                    SetListSource <DataRow>(_segmentValuesTable, _segmentValuesListTable.ListView);

                    // Complete the apply process
                    Segment_dialog.EndApplyChanges(e);
                });
            });
        }