If you have GNU grep, you can use [Perl regular expressions](http://perldoc.perl.org/perlre.html#Regular-Expressions), which have a [negation construct](http://perldoc.perl.org/perlre.html#(%3f!pattern)).
grep -A1 -P '^(?!.*ignore me).*needle'
If you don't have GNU grep, you can [emulate its before/after context options in awk](http://unix.stackexchange.com/questions/11193/is-there-any-alternative-to-greps-a-b-c-switches-to-print-few-lines-before/11201#11201).
awk -v after=3 -v before=2 '
/needle/ && !/ignore me/ {
for (i in h) {
print h[i];
delete h[i];
}
until = NR + after;
}
{
if (NR <= until) print $0; else h[NR] = $0;
delete h[NR-before];
}
END {exit !until}
'