Если вы сравните words[0]
и words[3]
, вы увидите, что они не совпадают. Это потому, что они являются указателями, поэтому операторы ==
, <
и т. Д. Будут искать адреса ваших строк C, а не их содержимое.
Так как их содержание одинаково, это возможно возможно & mdash; но не гарантировано & mdash; что их адреса тоже будут одинаковыми (это факт жизни со строковыми литералами). В вашем случае они не одинаковы, поэтому ключи логически различны, и оба элемента принимаются.
Указатели не являются контейнерами.
Вы можете заставить карту использовать strcmp
вместо , предоставив пользовательский компаратор, или вы можете просто использовать std::string
(или std::string_view
) для своих клавиш. :)
Поскольку вы возвращаетесь из первого вызова метода, второй не выполняется.
Попробуйте что-нибудь вроде
OnClientClick="var b = validateView();ShowDiv1(); return b"
или обратную ситуацию,
OnClientClick="ShowDiv1();return validateView();"
или если есть зависимость div1 от процедуры валидации.
OnClientClick="var b = validateView(); if (b) ShowDiv1(); return b"
Что может быть лучше, так это инкапсулировать несколько inline утверждений в мини-функцию, как это, чтобы упростить вызов:
// change logic to suit taste
function clicked() {
var b = validateView();
if (b)
ShowDiv1()
return b;
}
и затем
OnClientClick="return clicked();"
btnSAVE.Attributes.Add("OnClick", "var b = DropDownValidate('" + drp_compcode.ClientID + "') ;if (b) b=DropDownValidate('" + drp_divcode.ClientID + "');return b");
И, конечно, вы никогда не сможете вызывать эти две функции одновременно. Ни один человек в мире, кроме вас, одновременно работает на двух процессорах.
Лучший способ - вызвать родительскую функцию JavaScript и в ней указать всю последовательность функции, которую вы хотите вызвать. Например,
function ShowDiv1() {
document.getElementById("ReportDiv").style.display = 'block';
return false;
}
function validateView()
{
if (document.getElementById("ctl00_ContentPlaceHolder1_DLCategory").selectedIndex == 0) {
document.getElementById("ctl00_ContentPlaceHolder1_ErrorMsg").innerHTML = "Please Select Your Category";
document.getElementById("ctl00_ContentPlaceHolder1_DLCategory").focus();
return false;
}
if (document.getElementById("ctl00_ContentPlaceHolder1_DLEmpName").selectedIndex == 0) {
document.getElementById("ctl00_ContentPlaceHolder1_ErrorMsg").innerHTML = "Please Select Your Employee Name";
document.getElementById("ctl00_ContentPlaceHolder1_DLEmpName").focus();
return false;
}
ShowDiv1();
return true;
}
Это потому, что она возвращается после validateView();;
Используйте это:
OnClientClick="var ret = validateView();ShowDiv1(); return ret;"
Измените
OnClientClick="return validateView();ShowDiv1();">
на
OnClientClick="javascript: if(validateView()) ShowDiv1();">
Он не вызывается, потому что над ним есть оператор return. В следующем коде:
function test(){
return 1;
doStuff();
}
doStuff () никогда не будет вызываться. Я бы посоветовал написать функцию-оболочку
function wrapper(){
if (validateView()){
showDiv();
return true;
}
}
, а затем вызвать ее из обработчика onclick
.
Я думаю, что поскольку return validateView();
вернет значение (событие клика?), ваш второй вызов ShowDiv1();
не будет вызван.
Вы всегда можете обернуть несколько вызовов функции в другую функцию, т.е.
<asp:LinkButton OnClientClick="return display();"> function display() { if(validateView() && ShowDiv1()) return true; }
Вы также можете попробовать:
<asp:LinkButton OnClientClick="return (validateView() && ShowDiv1());">
Хотя я понятия не имею, вызовет ли это исключение.