GridView RowUpdating SqlDataSource.Update из CodeBehind

Итак, у меня возникла проблема с обновлением в Gridview во время события OnRowUpdating.

То, что я пытаюсь сделать, это установить UpdateCommand в SqlDataSource, а затем обновить с помощью этой команды. Событие запускается нормально, но когда событие выполняется, кажется, что строка никогда не обновляется.

C#:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    SqlDataSource1.UpdateCommand = "UPDATE A_Table SET Something = @AValue WHERE ID = " + e.RowIndex;

    SqlDataSource1.Update();
}

Изменить: переписал мой пример команды обновления... это действительно команда обновления, а не команда выбора, ха-ха.


person Derrick H    schedule 06.10.2011    source источник
comment
Вам не нужно ничего делать в событии RowUpdating, если у вас есть DataKeyNames, настроенный для GridView (и у вас есть UpdateCommand, определенный в разметке SQLDataSource1). Вызов метода Update() здесь приведет к тому, что UPDATE произойдет дважды.   -  person Josh Darnell    schedule 07.10.2011
comment
@jadarnel27 прав; если у вас настроен DataKeyNames, вызов Update() из обработчика RowUpdating вызовет исключение StackOverflowExeption!   -  person Kiley Naro    schedule 07.10.2011


Ответы (3)


Другие ответы здесь ОЧЕНЬ правильно указывают на проблему с вашим UpdateCommand.

Как я упоминал в комментарии ранее, я просто укажу, что это немного проще, чем то, что у вас есть. При использовании GridView с SQLDataSource большая часть работы выполняется за вас, если вы правильно настроили.

Во-первых, определите свой UpdateCommand в разметке для SQLDataSource, например так:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="Your Connection String Here" 
    ProviderName="System.Data.SqlClient" 
    SelectCommand="SELECT ColPK, ColA, ColB, ColC FROM Table_Name" 
    UpdateCommand="UPDATE Table_Name 
                   SET ColA=@ColA,  ColB=@ColB, ColC=@ColC, 
                   WHERE ColPK=@ColPK">
</asp:SqlDataSource>

(ColPK будет первичным ключом таблицы, которую вы обновляете)

Затем вы можете установить для параметра AutoGenerateEditButton значение true в своей разметке GridView и, пуф! Вы можете обновить GridView (без необходимости делать что-либо в коде).

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
    AutoGenerateEditButton="True" DataKeyNames="ColPK" 
    DataSourceID="SqlDataSource1">
    <Columns>
        <asp:BoundField DataField="ColPK" HeaderText="Column PK" 
            SortExpression="ColA" ReadOnly="True" />
        <asp:BoundField DataField="ColA" HeaderText="Column A" 
            SortExpression="ColA" />
        <asp:BoundField DataField="ColB" HeaderText="Column B" 
            SortExpression="ColB" />
        <asp:BoundField DataField="ColC" HeaderText="Column C" 
            SortExpression="ColC" />
    </Columns>
</asp:GridView>

Теперь вы все еще можете обрабатывать событие OnRowUpdating в своем коде, если вам нужно выполнить дополнительную обработку или отменить Update на основе некоторой логики и т. д. Но базовые функции обновления практически бесплатны!

person Josh Darnell    schedule 07.10.2011

Ваша команда UpdateCommand должна быть командой UPDATE, а не командой SELECT.

SqlDataSource1.UpdateCommand = "SELECT Something FROM A_Table WHERE ID = " + e.RowIndex;

Измените эту строку на что-то более близкое к этому:

SqlDataSource1.UpdateCommand = "UPDATE A_Table SET Something = @Something WHERE ID = " + e.RowIndex;

См. эту ссылку msdn для получения дополнительной информации о том, как использовать UpdateCommand:

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.sqldatasource.updatecommand.aspx

person Kiley Naro    schedule 06.10.2011

Во-первых, UpdateCommand не должно быть похоже на UPDATE A_Table SET ID = .. WHERE ...?

Я думаю, ты что-то упускаешь. Прочитайте Вставить запись "Обновить" "Изменить" "Удалить" в GridView. Это отличная статья для вас.

РЕДАКТИРОВАТЬ: Как говорит Кайли: попробуйте SqlDataSource1.UpdateCommand = "UPDATE A_Table SET Something = @Something WHERE ID = " + e.RowIndex;

person Soner Gönül    schedule 06.10.2011
comment
Упс, пример на самом деле не корректен. Я не стал публиковать сценарий, потому что он содержит конфиденциальную информацию, я просто написал плохо продуманный пример. На самом деле проблема не в команде обновления, а в ее выполнении. - person Derrick H; 07.10.2011