2-dimensional parity check can detect all two bit errors. Let's say the two bit error both happen in the same column, therefore, column parity bit will falsely assume that the data is right. However, the parity bit for the rows will be able to pick up the error, since the parity bit will not be correct.
Same thing happen when the error occur on the same row.
The other case is when the error bit occur on the parity bit, then we will still be able to check the error. In the case where one error is in the data and the other in parity bit, the other parity bits will be able to check down the error, because some of the parity bits will for sure shows there is an error in the scheme. For above example, the parity bits of the 1st and 2nd row will show that error has occur on that two rows, since the received parity bit does not match the parity bit calculated from the data bits. However, there is no way for us to tell which column it occurs on without knowing the original data set. Therefore, it is impossible in this case to correct the two bit errors.