2013-04-08 2 views
4

У меня есть редактируемый gridview, который пользователь может редактировать каждую строку, просто нажав кнопку linkbutton. Я получаю сообщение об ошибке и останавливает работу. пожалуйста помогите.Редактируемое gridview не работает

HTML

<asp:GridView ID="gvList" runat="server" class="gv" CellPadding="2" 
Font-Names="Calibri" ForeColor="#333333" 
Font-Size="16px" Width="500px" AutoGenerateColumns="true" OnRowCancelingEdit="gvList_RowCancelingEdit" 
OnRowEditing="gvList_RowEditing" OnRowUpdating="gvList_RowUpdating"> 
    <Columns> 
     <asp:TemplateField HeaderText="User Name" HeaderStyle-ForeColor="White" HeaderStyle-Font-Bold="true" ItemStyle-Width="170px"> 
     <ItemTemplate> 
       <asp:Label runat="server" ID="lblUsername" Text='<%# Eval("cUserName") %>'></asp:Label> 
     </ItemTemplate> 
     <EditItemTemplate> 
       <asp:TextBox ID="Editusername" runat="server" Text='<%# Eval("cUserName") %>'></asp:TextBox> 
     </EditItemTemplate> 

     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Dept User" HeaderStyle-ForeColor="White" HeaderStyle-Font-Bold="true" ItemStyle-Width="170px"> 
     <ItemTemplate> 
       <asp:Label runat="server" ID="lblDept" Text='<%# iif(Eval("lDeptUser"),"Yes","No") %>'></asp:Label> 
     </ItemTemplate> 
     <EditItemTemplate> 
       <asp:RadioButtonList ID="RadioButtonList1" runat="server" > 
       <asp:ListItem>Yes</asp:ListItem> 
       <asp:ListItem>No</asp:ListItem> 
       </asp:RadioButtonList> 
      </EditItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Actions" HeaderStyle-ForeColor="White" HeaderStyle-Font-Bold="true" ItemStyle-Width="160px"> 
      <ItemTemplate> 
       <asp:LinkButton ID="btnedit" CommandName="Edit" runat="server" Text="Edit" /> 
       <asp:LinkButton ID="btnDelete" CommandName="Delete" runat="server" Text="Delete" /> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:LinkButton ID="btnUpdate" CommandName="Update" runat="server" Text="Update" /> 
       <asp:LinkButton ID="btnCancel" CommandName="Cancel" runat="server" Text="Cancel" /> 
      </EditItemTemplate> 
        <HeaderStyle Font-Bold="True" ForeColor="White"></HeaderStyle> 
        <ItemStyle Width="120px"></ItemStyle> 
       </asp:TemplateField> 
      </Columns> 
       <EmptyDataTemplate> 
        No records available 
       </EmptyDataTemplate> 
       <HeaderStyle BackColor="#808380" Font-Bold="True" ForeColor="White" VerticalAlign="Top" /> 
       <EditRowStyle BackColor="#2461BF" /> 
       <AlternatingRowStyle BackColor="#E3E3E3" /> 
      </asp:GridView> 

VB

Protected Sub gvList_RowUpdating(sender As Object, e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles gvList.RowUpdating 

    Dim oldname = DirectCast(gvList.Rows(e.RowIndex).FindControl("lblUsername"), Label) 
    Dim username As String = DirectCast(gvList.Rows(e.RowIndex).FindControl("Editusername"), TextBox).Text 
    Dim tempUser = DirectCast(gvList.Rows(e.RowIndex).FindControl("RadioButtonList1"), RadioButtonList).SelectedIndex 
    Dim query As String = "Update Intranet.dbo.Gn_ISCoordinators SET [email protected]" + 
          ",[email protected] WHERE [email protected]" 

    Using con = New SqlConnection(ConfigurationManager.ConnectionStrings("IntranetConnectionString").ConnectionString) 
     con.Open() 
     Dim cmd = New SqlCommand(query, con) 
     cmd.Parameters.AddWithValue("@uname", username) 
     cmd.Parameters.AddWithValue("@dept", Convert.ToByte(tempUser)) 
     cmd.Parameters.AddWithValue("@oldname", oldname) 
     cmd.ExecuteNonQuery() 
    End Using 

    gvList.EditIndex = -1 
    GetList() 
End Sub 

Проблема заключается в cmd.ExecuteNonQuery() это дает мне The parameterized query '(@uname nvarchar(7),@dept tinyint,@oldname nvarchar(4000))Update' expects the parameter '@oldname', which was not supplied.

Любая вещь неправильно в моем запросе?

+0

После chaning ur typo mistak '@oldname', если у вас все еще ничего не получается, тогда PLS-check вы используете page.ispostback при привязке gridview 'if (! Page .IsPostBack) {gridviewBIND} 'refer http://satindersinght.blogspot.in/2012/08/how-to-addupdate-record-using-gridview.html –

+0

@Satindersingh да, я сделал это раньше. – 7alhashmi

+0

ваш код выглядит отлично, но эта строка 'command.commandtype = commandtype.текст 'отсутствует, может быть, проблема –

ответ

2

есть опечатка в вашем параметре

Dim query As String = "Update Intranet.dbo.Gn_ISCoordinators SET [email protected]" + 
         ",[email protected] WHERE [email protected]" 

И у вас есть

cmd.Parameters.AddWithValue("@oldname", oldname) 

не должно быть

cmd.Parameters.AddWithValue("@oldName", oldname) 

есть капитал и строчная ошибка.

+0

У меня точно такая же проблема !! – 7alhashmi

+0

Есть ли проблема с получением данных label, textbox и rbl с помощью 'DirectCast' ?? – 7alhashmi

+0

Потому что, когда я делаю отладку, значение во всех этих случаях ничего: S – 7alhashmi

4

Попробуйте

Dim oldname as Label =gvList.Rows(e.RowIndex).FindControl("lblUsername") 
    Dim username as TextBox = gvList.Rows(e.RowIndex).FindControl("Editusername") 
    Dim tempUser as RadioButtonList = DirectCast(gvList.Rows(e.RowIndex).FindControl("RadioButtonList1"), RadioButtonList).SelectedIndex 


    Dim query As String = "Update Intranet.dbo.Gn_ISCoordinators SET [email protected]" + 
           ",[email protected] WHERE [email protected]" 
Using con = New SqlConnection(ConfigurationManager.ConnectionStrings("IntranetConnectionString").ConnectionString) 
     con.Open() 
     Dim cmd = New SqlCommand(query, con) 
     cmd.Parameters.AddWithValue("@uname", username.Text) 
     cmd.Parameters.AddWithValue("@dept", Convert.ToByte(tempUser.SelectedIndex)) 
     cmd.Parameters.AddWithValue("@oldname", oldname.Text) 
     cmd.ExecuteNonQuery() 
    End Using 

вы должны изменить имя параметра, сделав «N» капитала в @ Старое_имя, поэтому из-за этого

вы получаете эту ошибку

+0

Даже после изменения у меня такая же проблема – 7alhashmi

+0

Вы получаете данные в имени пользователя, tempUser, oldname? –

+0

Я пытаюсь получить данные, но когда я делаю отладку и проверяю значение в имени пользователя, tempUserm и oldname, никаких данных! – 7alhashmi

2

Попробуйте
Код выглядит нормально, но эта строка command.commandtype = commandtype.text отсутствует, возможно, проблема.

Кроме того, при переходе параметра Addwithvalue использовать username.text вместо этого на username же для других элементов управления тоже

Dim oldname As Label = DirectCast(gvList.Rows(e.RowIndex).FindControl("lblUsername"), Label) 
Dim username As TextBox = DirectCast(gvList.Rows(e.RowIndex).FindControl("Editusername"), TextBox).Text 
Dim tempUser As RadioButton = DirectCast(gvList.Rows(e.RowIndex).FindControl("RadioButtonList1"), RadioButtonList).SelectedIndex 
Dim query As String = "Update Intranet.dbo.Gn_ISCoordinators SET [email protected], [email protected] WHERE [email protected]" 

Using con = New SqlConnection(ConfigurationManager.ConnectionStrings("IntranetConnectionString").ConnectionString) 
    con.Open() 
    Dim cmd = New SqlCommand(query, con) 
    cmd.commandtype = commandtype.text 
    cmd.Parameters.AddWithValue("@uname", username.text) 
    cmd.Parameters.AddWithValue("@dept", Convert.ToByte(tempUser.selectedvalue)) 
    cmd.Parameters.AddWithValue("@oldname", oldname.text) 
    cmd.ExecuteNonQuery() 
End Using 

gvList.EditIndex = -1 
GetList() 
2

К сожалению я не хватает респ комментировать так что я должен ответить здесь ...

Почему ты литье на этикетке и попытка использовать ее в виде строки ?:

Dim oldname as string = DirectCast(gvList.Rows(e.RowIndex).FindControl("lblUsername"), Label).text 

представляется более подходящим.

2

Я не уверен в этом, но, возможно, потому, что, когда вы пытались нажать кнопку редактирования, и режим gridview находится в режиме редактирования, метка lblUsername будет изменена на текстовое поле Editusername. Так что я предлагаю вам попробовать поставить глобальную переменная строка, которая будет хранить данные lblUsername перед обновлением или редактированием.

+0

Пожалуйста, дайте мне знать, если вы попробовали подход. Возможно, вы можете сохранить значение метки в событии редактирования gridview, а затем получить значение переменных при обновлении. – Clyde

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