Обновление таблицы SQL Server с помощью кнопки из Gridview с С# на странице aspx

Вопрос: UPDATE: обновленный код согласно объяснению katstevens. У меня есть таблица, которая обновляется с нефиксированным числом людей, которое используется для отслеживания посещаемости. Мне нужно обновить таблицу, когда пользователь нажимает кнопку с погодой или не прибывает, другими словами, когда пользователь приходит, они находят свое имя и нажимают кнопку, которая должна запускать код для выполнения ТОЛЬКО обновления

Вопрос:

UPDATE: обновленный код согласно объяснению katstevens.

У меня есть таблица, которая обновляется с нефиксированным числом людей, которое используется для отслеживания посещаемости. Мне нужно обновить таблицу, когда пользователь нажимает кнопку с погодой или не прибывает, другими словами, когда пользователь приходит, они находят свое имя и нажимают кнопку, которая должна запускать код для выполнения ТОЛЬКО обновления на их информации.

Я думал, что Gridview будет идеальным для этого, потому что он будет адаптироваться к различным количествам участников. Я обнаружил, что метод findcontrol не работает так, как должен, поскольку мой оператор обновления не может найти метку в поле itemtemplate. Есть ли другой способ сделать это, чтобы код позади мог найти contol. И представление сможет отображать всех участников независимо от того, сколько?

Этот конкретный код возвращает эту ошибку: CS0103: имя “FIRST_NAME” не существует в текущем контексте

Вот последняя попытка (из многих), на всякий случай, ее исправление.

Код позади: прокомментирован

Вот sqldatasourcecontrol:

<asp:SqlDataSource ID=»SqlDataSource1″ runat=»server» ConnectionString=»<%$ ConnectionStrings:myconnection %>» UpdateCommand=»UPDATE mytable SET CHECK_IN = 1 where mytable.[ID] = @lbl_ID» SelectCommand=»select command stuff… <SelectParameters> <asp:ControlParameter ControlID=»more select stuff…» PropertyName=»SelectedValue» /> </SelectParameters> <UpdateParameters> <asp:Parameter Name=»LBL_ID» /> </UpdateParameters> </asp:SqlDataSource>

И вот кнопка:

<asp:TemplateField ShowHeader=»False»> <ItemTemplate> <asp:Button ID=»btntkchkin» runat=»server» CausesValidation=»false» CommandName=»Update» Text=»Check In» OnClick=»btntkchkin_Click» /> </ItemTemplate> </asp:TemplateField> Лучший ответ:

Во-первых, позвольте мне уточнить несколько моментов вашего вопроса:

Многие элементы управления данными будут обрабатывать любое количество строк данных (ваше “количество участников”) – они будут продолжать повторяться до тех пор, пока все данные не будут связаны. Они несколько различаются с точки зрения компоновки и представления (сетка, список, с/без подкачки и т.д.), Но они лежат в основе принципа, что они будут отображать столько или несколько строк, сколько вы связываете с ними. К ним относятся GridView (только отображение таблицы), ListView (настраиваемый макет, который вы создаете, вертикальный или горизонтальный) и главным образом ретранслятор.

У вашего запроса, который выполняется в коде позади, есть несколько проблем. Сначала вы проанализируете наши четыре переменные, которые хотите использовать, затем создайте команду. Вы не задаете никаких параметров в запросе, но вы вводите 2 строки (FIRST_NAME и LAST_NAME). Затем вы привязываете четыре переменные к коллекции параметров, которая не содержит никаких параметров.

Содержание

  1. Обновленный код, с пояснением
  2. Поиск элемента управления в GridView
  3. Бонусный совет

Обновленный код, с пояснением

string CommandText = «UPDATE [mytable] SET CHECK_IN = 1 where mytable.[FIRST_NAME] = @FirstName and[mytable].[LAST_NAME] = @LastName»;

Два заполнителя, начинающиеся с @ (@FirstName, @LastName), являются параметрами и являются заполнителями для значений, которые вы добавляете в коллекцию Parameters.

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[«myconnection»].ConnectionString)) using (SqlCommand cmd = new SqlCommand(CommandText, conn)) {

Рекомендуется использовать оба соединения и команду при использовании блоков, чтобы они были правильно удалены, когда вы закончите. Помещение их один над другим означает, что одинаковый набор { } применяется к обоим.

string FIRST_NAME = ((Label)(GridView1.FindControl(«lbl_FIRST_NAME»))); string LAST_NAME = ((Label)(GridView1.FindControl(«lbl_LAST_NAME»))); string SESSION_ID = ((Label)(GridView1.FindControl(«lbl_SESSION_ID»))); string ID = ((Label)(GridView1.FindControl(«lbl_ID»))).Text;

Вам действительно не нужны эти переменные, и они вообще не будут найдены в GridView (см. Ниже), но я оставил их в любом случае, если они вам понадобятся.

Нам не нужно связывать Connection с Command потому что раньше мы это делали в блоке using().

cmd.Parameters.AddWithValue(«@FirstName», FIRST_NAME); cmd.Parameters.AddWithValue(«@LastName», LAST_NAME);

cmd.Parameters.Add устарел в новых версиях.NET, заменен на .AddWithValue, который позволяет одновременно указывать имя параметра и значение.

Нам не нужно связывать @SSN_ID и @ID потому что они не указаны в запросе. Если вы хотите добавить их, вам нужно изменить UPDATE команды для включения этих значений. Если вы хотите их использовать, привяжите их так же, как описано выше.

conn.Open(); cmd.ExecuteNonQuery();

Наконец, мы открываем соединение, затем выполняем запрос. Не нужно ничего закрывать; они будут располагаться автоматически.

GridView1.DataBind(); }

Затем мы переустанавливаем источник данных для получения обновленных значений.

Поиск элемента управления в GridView

К сожалению, когда GridView отображает, он добавляет дополнительные контейнеры для хранения данных в таблице. Если вы думаете об этом, запуск .FindControl() в GridView не будет работать, потому что элемент управления, который вы ищете, будет существовать для каждой строки GridView.

Чтобы решить вашу проблему, а не сделать вещи труднее, чем они должны быть, я бы сделал следующее:

Добавьте UpdateCommand в источник данных, который обновляет соответствующую строку соответствующими данными (текущее время, флажок отмечен, что угодно):

UpdateCommand=»UPDATE [mytable] SET CHECK_IN = 1 where mytable.[FIRST_NAME] = @First_Name AND [mytable].[LAST_NAME] = @Last_Name»

Добавьте два параметра в раздел UpdateParameters чтобы значения были привязаны при запуске запроса.

<UpdateParameters> <asp:Parameter Name=»First_name» /> <asp:Parameter Name=»Last_name» /> </UpdateParameters>

Затем установите для CommandName кнопки Update чтобы она запускала событие обновления в строке.

<asp:Button ID=»btntkchkin» runat=»server» CausesValidation=»false» CommandName=»Update» Text=»Check In» OnClick=»btntkchkin_Click»/>

Наконец, в вашем GridView установите DataKeyNames=»FIRST_NAME, LAST_NAME» чтобы DataSource знал, чтобы привязать эти значения в запросе.

По существу, что произойдет, всякий раз, когда btntkchkin кнопка btntkchkin, она будет возвращена на сервер и запустит UpdateCommand, заполнив любые параметры из строки, в которой была кнопка. Это выполняется на сервере, и страница перезагружается в браузере, Я считаю, что он также вызовет DataBind для источника данных для вас – если нет, вы всегда можете добавить обработчик событий, чтобы сделать это явно.

Бонусный совет

Лично я использовал бы поле Unique ID для обновления Проверенного времени, а не для совпадения имен First и Last – что произойдет, если у вас есть два человека с тем же именем?

Вы можете добавить дополнительные поля (SSN_ID, ID) в команду UPDATE, добавив их с помощью параметра placeholder (@SSN_ID, @ID), а затем добавив параметр asp:Parameter в раздел UpdateParameters. Если ваши метки установлены в Bind() тогда DataSource автоматически свяжет их со всеми полями запроса при запуске команды.

Оставьте комментарий, если какое-либо из этого не работает или не решит вашу проблему.

Оцените статью
Добавить комментарий