Сложное редактирование на gridview в C # - PullRequest
2 голосов
/ 14 октября 2010

Я работаю в системе посещаемости, которая имеет следующие таблицы:

Entry
+---------+-----------+
+ EntryID + EntryDate +
+---------+ ----------+


Hour
+---------+--------+---------+
+ EntryID + InHour + OutHour +
+---------+--------+---------+

Со следующими примерами данных:

Entry
+---------+---------------------+
+ EntryID +     EntryDate       +
+---------+---------------------+
+   1     + 1/1/2010 8:00:00 AM +
+   2     + 1/1/2010 8:01:02 AM +
+---------+---------------------+

Hour
+---------+---------------------+-----------------------+
+ EntryID +        InHour       +        OutHour        +
+---------+---------------------+-----------------------+
+    1    + 1/1/2010 8:00:00 AM +  1/1/2010 1:00:00 PM  +
+    1    + 1/1/2010 2:04:00 PM +  1/1/2010 6:03:00 PM  +
+    2    + 1/1/2010 8:01:02 AM +  1/1/2010 1:02:00 PM  +
+---------+---------------------+-----------------------+

И у меня есть следующая сетка:

alt text

Мне нужна помощь с тем, как мне следует подать запрос, который мой клиент сделал сегодня ...

В настоящее время при вызове этого вида сетки поля «Arrives At» и «Leaves At» извлекаются путем запроса к базе данных и объединения всех часов в строку с последующей печатью. Однако мой клиент теперь хочет иметь возможность изменять любое время в столбце «Листья в». Я вообще не знаю, как подойти к этому запросу, поскольку часы сгруппированы в одной ячейке. Я думал показывать часы в текстовой области, но нет никакого способа, чтобы изменения были правильно применены к базе данных, если бы я сделал это.

Буду очень признателен за любую помощь, поскольку я чувствую себя подавленным этим.

Заранее спасибо, Итон Б.

Ответы [ 3 ]

1 голос
/ 14 октября 2010

Это способ, которым я делаю подобное.

<span id="HourID_445" onclick="EditMe(this);">17:42:51</span>

Теперь, когда вы нажимаете на этот час, вы открываете с помощью jQuery диалоговое окно iframe и отправляете идентификатор промежутка, который вы щелкнули, исодержит идентификатор часа, который нужно отредактировать.Итак, у вас есть идентификатор, у вас есть простой диалог .aspx внутри iframe, вы делаете редактирование, нажимаете OK, сохраняете его, а затем после сохранения вы также обновляете диапазон обратно в таблицу.

Ключевым моментом здесь является то, что вы скрываете идентификатор часа внутри элемента span и получаете его с помощью Javascript.

Если я не совсем уверен, пожалуйста, спросите меня для получения дополнительной информации.

Без jQuery

Существует высокий уровень: http://highslide.com/

Смотрите этот пример http://highslide.com/examples/iframe.html

Вы можете использовать hislide, и вы просто делаетеэта простая линия на каждый раз.

<a href="EditTime.aspx?TimeID=23" 
    onclick="return hs.htmlExpand(this,{objectType:'iframe'} )">23:00:00</a>
1 голос
/ 14 октября 2010

Один из подходов состоит в том, чтобы позволить обновлениям более Ajaxy, как говорит Аристос.Обычно это считается более удобным для пользователя подходом и, безусловно, предлагает более приятное взаимодействие с пользователем, но требует знакомства с jQuery и JavaScript, а взаимодействие между клиентом и сервером с вашей точки зрения немного сложнее.

ЕслиЕсли вы хотите продолжать использовать парадигму веб-управления, рассмотрите возможность заполнения полей TemplateFields для полей «Прибытие в» и «Листья в».В ItemTemplate вы могли бы продолжать отображать текст, который вы объединяете в базе данных, но вы бы поместили GridView в EditItemTemplate.Этот GridView может быть связан с элементом управления источником данных (также в EditItemTemplate) и настроен для поддержки редактирования.Если вы программно связываете данные (т. Е. Вы не используете элемент управления источником данных), вам нужно будет привязать данные к дочернему GridView, когда родительская строка станет редактируемой.Это можно сделать декларативно, используя разметку следующим образом:

<asp:TemplateField ...>
    <EditItemTemplate>
        <asp:GridView runat="server" id="gvChild" DataSource='<%# SomeFunction() %>' ...>
           ...
        </asp:GridView>
    </EditItemTemplate>
</asp:TemplateField>

Здесь SomeFunction будет функцией в вашем классе code-behind (обычно), которая возвращает данные для привязки к сетке.

В качестве альтернативы, вы можете привязать данные к дочернему GridView программно через обработчик событий RowDataBound родительского GridView.А именно, вы бы проверили, имеете ли вы дело с редактируемой строкой (то есть, если e.Row.RowIndex = ParentGridViewID.EditIndex).Если это так, вы можете программно ссылаться на дочерний GridView, используя e.Row.FindControl("ChildGridViewID"), а затем установить его свойство DataSource и вызвать его метод DataBind.

Когда пользователь нажимает кнопку «Изменить» для родительской сетки, «Прибытие»В ячейках «» и «Выйти в» будут отображаться сетки с собственными кнопками «Правка» для изменения времени.В качестве альтернативы, вы можете поместить дочерний редактируемый GridView в ItemTemplate, если хотите, чтобы пользователи редактировали время «Прибытие» и «Покинуть в», не требуя, чтобы пользователь сначала выбрал редактирование родительской записи.

0 голосов
/ 14 октября 2010

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

Если ваш клиент действительно хочет эти изменения, возможно, пришло время сообщить им, что это не так просто.

P.S. Серьезно, я чувствую твою боль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...