ПРИМЕЧАНИЕ: В ситуациях, когда пользователю необходимо сделать заявление, например: (A == B AND B != C OR (A == B OR (A == C)))
, ваше решение будет работать только в том случае, если вы предоставите пользователю больше опций в выпадающих списках левых и правых скобок,В раскрывающемся списке левых скобок должны быть указаны следующие параметры: '(', '((', '(((', '(((('
, и вы можете выделить его в 4 левых скобках подряд.Выпадающие правые скобки должны выглядеть одинаково.
Вы можете поместить свои выпадающие списки в репитер, чтобы .Net назначал каждому выпадающему уникальный идентификатор.
Код проверки:
// this will keep track of left brackets that have not been closed
int numUnclosedLeftBrackets = 0;
// changing dropdown instance names for clarity
ddlLeftBracket == DropDown1;
ddlCriteria == DropDown2;
ddlConOperator == DropDown3;
ddlValue == DropDown4;
ddlRightBracket = DropDown5;
ddlExtension == DropDown6;
Boolean isValidStmt = false;
Boolean areValidBrackets = false;
Boolean addAnotherStmt = false;
// conditional operator dropdown cannot be blank
if(ddlConOperator.SelectedIndex > 0)
{
if(ddlConOperator.SelectedValue == "=" && ddlCriteria.SelectedValue == ddlValue.SelectedValue)
isValidStmt = true;
if(ddlConOperator.SelectedValue == "<>" && ddlCriteria.SelectedValue != ddlValue.SelectedValue)
isValidStmt = true;
// check if both left and right brackets exist, or if both do not exist.
if((ddlLeftBracket.SelectedIndex == 0 && ddlRightBracket.SelectedIndex == 0) ||
(ddlLeftBracket.SelectedIndex > 0 && ddlRightBracket.SelectedIndex > 0))
areValidBrackets = true;
// check if AND, or OR is attached
if(ddlExtension.SelectedIndex != 0)
{
addAnotherStmt = true;
// check if brackets need to be validated now that the where clause will continue on
if(!areValidBrackets)
{
// check if left bracket but no right bracket
if(ddlLeftBracket.SelectedIndex > 0 && ddlRightBracket.SelectedIndex == 0)
{
areValidBrackets = true;
numUnclosedLeftBrackets += ddlLeftBracket.SelectedIndex;
}
// check if right bracket but no left bracket
if(ddlLeftBracket.SelectedIndex == 0 && ddlRightBracket.SelectedIndex > 0)
{
// check if left bracket needs closing in a previous value/criteria row and make sure user is not trying to add more right closing brackets than allowed
if(numUnclosedLeftBrackets > 0 && (numUnclosedLeftBrackets - ddlRightBracket.SelectedIndex) > -1)
{
areValidBrackets = true;
numUnclosedLeftBrackets -= ddlRightBracket.SelectedIndex;
}
}
}
}
else
{
// Since the user has not selected AND or OR, check that there are no unclosed left brackets remaining
if(numUnclosedLeftBrackets > 0)
areValidBrackets = false;
}
}
if(!areValidBrackets)
// brackets not valid
else
if(!isValidStmt)
// not a valid statement
else
if(addAnotherStmt)
// create a new row
else
// finished and valid - allow saving valid 'WHERE clause' string
Вы можете сделать так, чтобы была включена самая последняя строка повторителя, а все предыдущие строки были отключены, что вынуждает пользователя удалять каждую самую последнюю строку до теххочу редактировать становится активным.Это упрощает валидацию, потому что вас интересует только самая последняя строка, зная, что все предыдущие строки были проверены.Когда самая последняя строка является допустимой, будет безопасно запускать всю строку в качестве предложения SQL WHERE.
ПРИМЕЧАНИЕ: Если вы заблокируете предыдущие строки, как я предложил, то когдаПользователь удаляет самую последнюю строку, вам нужно будет проверить значение numUnclosedLeftBrackets
, и для этого может потребоваться несколько иной подход, такой как: сохранение индекса строки повторителя для каждой строки, содержащей незакрытую левую скобку.