Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Как да вземам стойности само на определени checkbox

Featured Replies

  • Автор

Нали този форум е затова, когато има някой проблем да помогне, а не както правите вие да давате линкове на някакви книги и да се прави на много умни 

  • 2 седмици по-късно...
на 3.06.2019 г. в 12:05, petar96 написа:

Нали този форум е затова, когато има някой проблем да помогне, а не както правите вие да давате линкове на някакви книги и да се прави на много умни 

Здравейте, 

Този форум е точно за това, когато някой има затруднения и проблеми, хората да се опитат да им помогнат. Но за да се получи това, трябва да можем да си говорим "на един език" т.е. на един и същ терминологичен речник.

Не винаги хората имат време (и нерви :) ) да седнат да обясняват "азбуката" или ако трябва - то комуникацията си се води на ЛС-та.

Така, да се върнем на оригиналния въпрос: "Как да вземам стойности само на определени checkbox"

Фактически, въпроса е доста по - голям от това обаче - програмата Ви трябва да може не само да взема флаговата стойност на дадено входно поле, но и да презизчислява допълнително данните в друго поле (крайна/междинна цена).

Ще използвам псевдо-код за да изложа предложенията, което вярвам, че щом сте стигнали до тук, няма да е проблем да си ги реализирате на C#. 

Предложение 1: Реализация с бутон за преизчисляване.

Мотивация: Директната реализация на изчисляването може да се извърши по метода на "събиране" на входните данни, чрез ръчно действие на потребителя. В реалния свят, това е бутон "Изчисли/Преизчисли". В случаите, когато говорим за реализирането на фукционалност, използваща архитектурата "Клиент-Сървър", това е по - разционалния подход, защото потребителя им контрол кога да отправи запитването. Допълнително се постига и добра производителност на системата, защото сървъра, който ще извърши изчислението, ще бъде запитан само когато потребителя поиска.

Псевдо-реализация: 

1) Цялата проверка се извършва САМО когато се натисне бутона за "Изчисли/Преизчисли"

2) Всяка проверка за всеки check-box е НЕЗАВИСИМА - използва се САМО if statement-a.

Псевдокод:

private void onClickButtonRecalculate() {
	double totalSum = 0;
	
	For every standard input field INPUT
	Do:
		totalSum += calculateForInput(INPUT);
	End;
	
	// For each of the checkboxes:
	if (checkbox1 == true) {
		totalSum += calculateForCheckbox(checkbox1);
	}
	if (checkbox2 == true) {
		totalSum += calculateForCheckbox(checkbox2);
	}
        ...
	if (checkboxN == true) {
		totalSum += calculateForCheckbox(checkboxN);
	}
	
	totalSumLabel = totalSum;
}

 

Предложение 2: Event-driven подход:

Мотивация: Често, клиентите искат да виждат всяка промяна по конфигурацията си да се отразява веднага върху набора от избрани техни параметри, без да се налага експлицитно те да правят заявка за преизчисляване. В този случай, и за постигането на целите, можем да обезпечим програмата с код, който се изпълнява на определено действие върху някой input. По този начин, ще се постигне real-time получаване на резултат. Този метод дава доста по-добър user experience, но в архитектура client-server може да натовари обработката, ако заявките се изпращат постоянно. В този случай, преизчислението има повече смисъл реално да не се предава на сървъра, а да се прави от самия клиент (с JavaScript). Независимо от програмната реализация, подхода е еквивалентен.

Псевдо-реализация:

1) За всека една входна контрола, която ще въздейства върху резултата се определя кое събитие, породено от потребителско действие ще модифицира резултата. Възможни събития са: onClick, onFocus, onFocusOut, onKeyDown, onKeyUp и т.н. 

2) За да се постигне този вариант, метода за изчисляване на "допълнителни" екстри трябва да е НЕЗАВИСИМ от останалите полета - това ще рече, че резултата от изчислението не може да зависи от досега получения резултат (т.е. добавяне на резултата чрез проценти, модулни и степенни операции не винаги могат да се отменят нетривиално). Във Вашия случай, check-box полетата добават стойност, която не е обвързана със досегашния резултат, което означава, че са обратими. Тука обаче трябва да се отбележи нещо - за да може да отмените операция, трябва да пазите стойностите на операндите, с която е направена промяната. В случая, трябва да пазите с колко дни са изчислявани всички check-box полета. 

3) Реализацията на това може да се постигне по два начина отново:

     3.1.) Чрез преизчисляване на ВСИЧКО за всяка направена промяна, при интеракция с което и да input поле - де факто, ще трябва за всяко поле, което може да се променя да закачите функция, еквивалентна на функцията onClickButtonRecalculate() от Предложение 1.

     3.2.) За всеки input да закачите програмна логика, която ще изчислява САМО неговата част от общата стойност - разбира се, това означава, че за всеки такъв input ще трябва да пазите предходна стойност, за да може правилно да извадите предходния резултат и да добавите новия при промяна.

     Псевдо-код:

// Global or Static:
Map<Object, Object> previousValuesAddedFromField;

// For EVERY checkbox or INPUT, define thiis method for the selected event handler:
private void onClickOrInputForField(targetField) {

	// Take current total result.
	currentTotalResult = getDoubleFromLabel(totalSumLabel);
	
	// Take from global cache the previously added value, so that you can "undo" it.
	previouslyAddedValue = previousValuesAddedFromField.get(targetField);
	
	// Calculate the new value, that tou need to add
	currentlyCalculatedValue = calculateAdditionalTax(targetField);
	
	// The operation ONLY need to be done, if we have different data to 
	// substitute - no need to do anything, if there won't be change.
	if (previouslyAddedValue != currentlyCalculatedValue) {
	
		// Remove previusly added.
		currentTotalResult -= previouslyAddedValue;
		// Add new data.
		currentTotalResult += currentlyCalculatedValue;
		// Update the cache value with the new one.
		previousValuesAddedFromField.put(targetField, currentlyCalculatedValue);
		// Change the totalSum to indicate the newly calculate value.
		totalSumLabel = currentTotalResult;
		
	}
}

// Extract double value from the input field.
private double getDoubleFromLabel(targetField) {

	// TODO: Add checks, that targetField.data is valid double indeed.
	
	return targetField.data == null ? 0 : parseDouble(targetField.data);
}

// Calculate for this field what to add
private double calculateAdditionalTax(targetField) {
	double result = 0;
	switch(targetField) {
		case checkBox1:
			result = ...
			break;
		case checkBox2:
			result = ...
			break;
		...
	}
	return result;
}

За момента, това са подходите, които на prima vista ми идват на акъла - относително разбираеми и леки за имплементиране.

Поздрави !

 

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.