2015-07-06 3 views
1

Попытка обновить мою БД из функции редактирования/обновления GridView. Что бы я ни старался, я не могу работать.Невозможно обновить источник данных из обновления gridview

Как я могу обновить свой SQLDatasource, используя информацию, введенную в текстовое поле редактирования GridView?

Вот что у меня есть:

.cs:

    DS.UpdateCommand = "UPDATE tbSystems SET Systems = @Systems WHERE id = @id"; 
        DS.Update(); 

.aspx:

   <asp:GridView ID="gv1" 
        runat="server" 
        CellPadding="2" 
        DataKeyNames="id" 
        AutoGenerateDeleteButton="True" 
        AutoGenerateEditButton="True" 
        OnRowDeleting="gv1_RowDeleting" 
        OnRowDeleted="gv1_RowDeleted" 
        OnRowUpdating="gv1_RowUpdating" OnRowEditing="gv1_RowEditing" OnRowUpdated="gv1_RowUpdated"> 
       </asp:GridView> 
       <asp:SqlDataSource ID="DS" runat="server" ConnectionString="<%$ ConnectionStrings:conn %>"> 
        <UpdateParameters> 
         <asp:Parameter Name="Systems" Type="String" /> 
        </UpdateParameters> 
       </asp:SqlDataSource> 

Я получаю эту ошибку:

Must declare the scalar variable "@id".

  1. Sho uldn't идентификационная переменная объявляется уже, так как у меня есть , объявленный в DataKeyNames GridView, или мне нужно создать параметр обновления в SQLDataSource?
  2. Как получить новое значение в текстовом поле GridView? Эта строка кода всегда дает старое значение независимо от того, в каком событии (событие редактирования, событие обновления или обновленное событие) я помещаю его в:

    Response.Write (((TextBox) gv1.Rows [e.NewEditIndex] .Cells [2] .Controls [0]) Текст).

  3. Как мне управлять @variables?

Ваша помощь очень признательна.

ответ

1

Вам не нужно никакого кода для подключения GridView к SqlDataSource управления. Просто установите соответствующие свойства на контроле, и он будет просто работать:

<asp:GridView ID="gv1" runat="server" 
    DataSourceID="DS" 
    DataKeyNames="id" 
    AutoGenerateDeleteButton="True" 
    AutoGenerateEditButton="True" 
/> 

<asp:SqlDataSource ID="DS" runat="server" 
    ConnectionString="<%$ ConnectionStrings:conn %>" 
    SelectCommand="SELECT * FROM tbSystems" 
    UpdateCommand="UPDATE tbSystems SET Systems = @Systems WHERE id = @id" 
    DeleteCommand="DELETE tbSystems WHERE id = @id" 
> 
    <UpdateParameters> 
     <asp:Parameter Name="id" Type="Int32" /> 
     <asp:Parameter Name="Systems" Type="String" /> 
    </UpdateParameters> 
    <DeleteParameters> 
     <asp:Parameter Name="id" Type="Int32" /> 
    </DeleteParameters> 
</asp:SqlDataSource> 

Важными свойствами являются:

  • DataSourceID - соединяет GridView к SqlDataSource;
  • SelectCommand - указывает команду SQL, используемую для заполнения GridView;
  • UpdateCommand - указывает команду SQL, используемую для обновления записи;
  • UpdateParameters - определяет параметры, переданные в UpdateCommand;
  • DeleteCommand - указывает команду SQL, используемую для удаления записи;
  • DeleteParameters - определяет параметры, переданные в DeleteCommand;

С этими свойствами на месте вы можете избавиться от обработчиков событий в коде. Управление источником данных позаботится обо всем для вас.

ASP.NET Data-Bound Web Server Controls Overview
Data Source Controls Overview

+0

Это работает, как вы объяснили. Благодарю. Я закончу это последним вопросом: это работает с соединением gridview и SQLDataSource. На моей странице есть кнопки доступа к различным таблицам БД. В этом случае вы бы создали x количество SQLdatasources и изменили gridview datasourceID, когда это было необходимо, или вы поедете с другим вариантом? – Rimo72

+1

@ Rimo72: Я был бы склонен иметь отдельный 'SqlDataSource' и' GridView' для каждой таблицы и использовать что-то вроде ['MultiView' control] (https://msdn.microsoft.com/en-us/ library/system.web.ui.webcontrols.multiview (v = vs.110) .aspx), чтобы показывать только текущую сетку. –

+0

Это будет работать для меня. Большое спасибо за вашу помощь. – Rimo72

0

Shouldn't the id variable be declared already since I have it declared in the DataKeyNames of the GridView or should I create an update parameter in the SQLDataSource?

Нет, вы должны получить значение, как этот

var id = GridView1.DataKeys[e.RowIndex]["id"]; 

How do I get the new value in the textbox of the GridView? This line of code always give the old value regardless in which event (edit event, updating event or updated event) I put it in

Вы должны использовать событие RowUpdating. MSDN sample code here.

How do I manage the @variables?

var systems = ((TextBox)gv1.Rows[e.RowIndex].Cells[2].Controls[0]).Text; 
DS.UpdateParameters.Add("@id", id); 
DS.UpdateParameters.Add("@Systems", systems); 
+0

Навин, спасибо за обратную связь. Я следил за вашим руководством, и это дает мне эту ошибку. Должен объявить скалярную переменную «@Systems». Могу ли я предположить, что в моем SQL-запросе отсутствует декларация? Должен ли я добавить DECLARE в свой SQL-запрос? – Rimo72

+0

Удалено @ в параметре добавления и исправлена ​​ошибка. Как всегда, эта строка: 'var systems = ((TextBox) gv1.Rows [e.RowIndex] .Cells [2] .Controls [0]). Text;' дает мне старое значение для ячейки, а не новую. Некоторое время искал эту проблему. Это не дает мне данные текстового поля. – Rimo72

+0

отсутствовал. рада узнать, что проблема решена. – naveen

1

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

Поместите SQLDataSource в сеанс. Я не knkow, если это правильно, но это единственный способ найти значение текстового поля редактирования gridview.

if (!Page.IsPostBack) 
{ 
       DS.SelectCommand = "SELECT * FROM tbSystems"; 
       Session["myDS"] = DS; 
       BindData(); 
} 

Создано функцию BindData: (GV1 быть моим GridView)

private void BindData() 
     { 
      gv1.DataSource = Session["myDS"]; 
      gv1.DataBind(); 
     } 

В функции RowEditing, я изменил индекс редактирования GV1 на события нового индекса редактирования.

protected void gv1_RowEditing(object sender, GridViewEditEventArgs e) 
     { 
      gv1.EditIndex = e.NewEditIndex; 
      //Bind data to the GridView control. 
      BindData(); 

И это код обновления.

protected void gv1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
     { 

        DS.UpdateCommand = "UPDATE tbSystems SET Systems = @Systems WHERE id = @id"; 
        var id = gv1.DataKeys[e.RowIndex]["id"]; 
        var systems = ((TextBox)gv1.Rows[e.RowIndex].Cells[2].Controls[0]).Text; 
        DS.UpdateParameters.Add("id",id.ToString()); 
        DS.UpdateParameters.Add("Systems",systems); 
        DS.Update(); 
        gv1.EditIndex = -1; 
        BindData(); 
     } 

Надеюсь, это поможет некоторым из вас.

Спасибо,

+0

Хранение элемента управления в состоянии сеанса является * крайне плохой идеей. Вам не нужны какие-либо из методов кода, которые вы опубликовали, - просто установите соответствующие свойства в элементе управления 'SqlDataSource'. –

+0

Как я уже сказал, не уверен, что это правильно. Работая над этим в течение недели, это единственный способ заставить меня работать. Что бы вы изменили из приведенного выше кода, чтобы сделать его правильное кодирование? Вы можете помочь? – Rimo72

+0

Я отправил ответ, который должен помочь. В принципе, вам не нужен какой-либо код для соединения сетки и источника данных вместе. Это было основным преимуществом элементов управления источниками данных. –

Смежные вопросы