ASP.Net GridView - команда обновления строки не возвращается обратно только для отображения - PullRequest
1 голос
/ 19 января 2010

У меня есть GridView, который заполняется из LinqDataSource. Когда я обновляю строку, запускается RowCommand, и изменения сохраняются в базе данных, но Grid не обновляется. У меня есть это в UpdatePanel и явно вызвать Update () в обработчике RowCommand, но нет обратной передачи, и страница просто сидит там в режиме редактирования. Как только я нажму «Отмена», он вернется в режим «Только для просмотра», и сетка покажет новое значение.

Я подозреваю, что в проводке GridView относительно источника данных что-то не так. Не исключение пузырится, хотя. Урезанная копия разметки находится ниже. Есть идеи?

<asp:UpdatePanel ID="uPanel" runat="server" UpdateMode="Conditional" 
  EnableViewState="true" ChildrenAsTriggers="true">
  <ContentTemplate>
    <asp:LinqDataSource ID="YieldDataSource" runat="server" 
        ContextTypeName="myhDataContext" TableName="vw_drug_yields" 
        OnSelecting="YieldDataSource_Selecting" EnableUpdate="true" />
    <asp:GridView ID="YieldGridView" runat="server" Width="900px" 
         OnRowDataBound="editGrid_RowDataBound"
         DataSourceID="YieldDataSource" EnableViewState="true"
         OnRowCommand="YieldGridView_RowCommand">
    <Columns>
      <asp:TemplateField HeaderText="Net Fill" ItemStyle-HorizontalAlign="Center">
          <ItemTemplate><%# DataBinder.Eval(Container.DataItem, "net_fill") %>
          </ItemTemplate>
          <EditItemTemplate><asp:TextBox ID="tbNetFill" runat="server" 
          Text='<%# DataBinder.Eval(Container.DataItem, "net_fill") %>' >
          </asp:TextBox></EditItemTemplate>
      </asp:TemplateField>
      <asp:TemplateField ShowHeader="False" ItemStyle-Width="40px">
          <ItemTemplate>
             <asp:ImageButton CommandName="Edit" ID="btnEdit" SkinID="btnEdit" 
             runat="server" ToolTip="Edit" CausesValidation="false"/> 
          </ItemTemplate>
          <EditItemTemplate>
             <asp:ImageButton CommandName="Update" ID="btnSubmit" SkinID="btnSubmit" 
             runat="server" ToolTip="Save" CausesValidation="true" 
             CommandArgument="<%# ((GridViewRow) Container).DataItemIndex %>" /> 
             <asp:ImageButton CommandName="Cancel" ID="btnCancel" SkinID="btnCancel" 
             runat="server" ToolTip="Cancel" CausesValidation="false"/> 
          </EditItemTemplate>
      </asp:TemplateField>
    </Columns>
   </asp:GridView></ContentTemplate></asp:UpdatePanel>

Обработчик:

protected void YieldGridView_RowCommand(Object sender, 
      GridViewCommandEventArgs e) {
  if (e.CommandName == "Update") {
      try {
          int index = Convert.ToInt32(e.CommandArgument);

          GridViewRow gdrow = YieldGridView.Rows[index];

          // do some validation and handle update

             db.SubmitChanges();

          YieldGridView.DataBind();
          uPanel.Update();
      }
      catch (Exception ex) {
          ShowError(this, "Error while updating yields", ex, true);
      }
  }

Ответы [ 3 ]

3 голосов
/ 20 января 2010

После удаления UpdatePanel и отключения обратных вызовов для GridView я получил следующую ошибку при нажатии кнопки Обновить:

Не удалось найти строку, которая соответствует заданные ключи в исходных значениях хранится в ViewState. Убедитесь, что словарь ключей содержит уникальный ключ значения, соответствующие строке вернулся из предыдущего выбора работа.

Проблема в том, что нет единого уникального ключа для этих данных, так как они динамически собираются из разных источников. В этом нет необходимости, но кажется, что GridView с LinqDataSource не может функционировать без него. Кроме того, я заполняю сетку из представления, у которого нет первичного ключа. Решение включало 3 изменения:

  • отключение обновлений для LinqDataSource
  • изменение имени команды с Update на MyUpdate (чтобы Linq не пытался автоматически подключить ее)
  • установка YieldGridView.EditIndex = -1 до вызова Update на UpdatePanel

Спасибо за вашу помощь.

0 голосов
/ 19 января 2010

попробуйте это:

YieldGridView.DataBind();
//though this seems useless after call to DataBind, but lets just try :)
YieldGridView.EditIndex = -1;
uPanel.Update();
0 голосов
/ 19 января 2010

Перед вызовом Update () вызовите GridView.DataBind () для повторной привязки к элементу управления LINQDataSource.

...