【问题标题】:Editable gridview is not working可编辑的网格视图不起作用
【发布时间】:2013-03-30 02:06:56
【问题描述】:

我有一个可编辑的网格视图,用户只需按下链接按钮即可编辑每一行。我收到一个错误,它停止了我的工作。请帮帮我。

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 cUserName=@uname" +
                          ",lDeptUser=@dept WHERE cUserName=@oldName"

    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.

我的查询有什么问题吗?

【问题讨论】:

  • 改错错字'@oldname'后,如果您仍然一无所获,请检查您是否在绑定gridview if (!Page.IsPostBack) {gridviewBIND} 时使用page.ispostback@参考satindersinght.blogspot.in/2012/08/…
  • @Satindersingh 是的,我以前做过。
  • 您的代码看起来不错,但缺少这行 command.commandtype = commandtype.text 可能是问题所在
  • 如果变量(在本例中为oldname)为Nothing,则会出现此错误。

标签: asp.net vb.net gridview


【解决方案1】:

试试这个

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 cUserName=@uname" +
                              ",lDeptUser=@dept WHERE cUserName=@oldname"
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

您已经通过在@oldName 中使用“N”大写来更改参数名称,因此

你得到了那个错误

【讨论】:

  • 即使在更改后我也遇到了同样的问题
  • 你在 username ,tempUser,oldname 中获取数据吗?
  • 我正在尝试获取数据,但是当我进行调试并检查用户名 tempUserm 和 oldname 中的值时,没有数据!
  • 我在cmd.Parameters.AddWithValue("@oldname", oldname.Text) 上收到此错误Object reference not set to an instance of an object.
  • 首先看看你是否会在 oldname 中获取数据,如果你得到了而不是尝试这个。将这个值保存在另一个变量中,然后将该变量传递给参数。所以它看起来像 ,olnm=oldname.text而不是像这样将这个参数添加到 cmd.Parameters.AddWithValue("@oldname", olnm)
【解决方案2】:

你的参数有错别字

  Dim query As String = "Update Intranet.dbo.Gn_ISCoordinators SET cUserName=@uname" +
                      ",lDeptUser=@dept WHERE cUserName=@oldName"

你有

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

不应该是这样吗

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

有大小写错误。

【讨论】:

  • 我遇到了同样的问题!!
  • 使用DirectCast获取标签、文本框和rbl数据有问题吗??
  • 因为当我调试时,所有这些值都没有:S
  • 如果标签存在则需要获取Label的Text。
【解决方案3】:

对不起,我没有足够的代表发表评论,所以我必须在这里回答......

为什么要将标签转换为标签并尝试将其用作字符串?:

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

似乎更合适。

【讨论】:

    【解决方案4】:

    我对此不确定,但可能是因为当您尝试点击编辑按钮并且 gridview 的模式处于编辑模式时,lblUsername 标签将更改为 Editusername 文本框。所以我建议您尝试放置一个全局变量在更新或编辑之前将存储 lblUsername 数据的字符串..

    【讨论】:

    • 如果您尝试过这种方法,请告诉我。也许您可以将标签的值存储在 gridview 编辑事件中,然后在更新时获取变量值..
    【解决方案5】:

    试试这个
    代码看起来不错,但是缺少这行 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 cUserName=@uname, lDeptUser=@dept WHERE cUserName=@oldName"
    
    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多