DataGrid1.DataKeys[(int)e.Item.ItemIndex]没有获得值,请查一下你的程序,是否定义了DATAKEY

解决方案 »

  1.   

    如果DataGriD1.DataKeyFiled设为id的话就显示如下错误参数 @Id 没有默认值。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.OleDb.OleDbException: 参数 @Id 没有默认值。源错误: 
    行 54:      
    行 55:    Comm.Connection.Open();
    行 56:   Comm.ExecuteNonQuery();
    行 57:   Comm.Connection.Close();
    行 58:   BindGrid();
     源文件: F:\shop\admin_addbigclass.aspx.cs    行: 56 
      

  2.   

    给个VB的你看看吧!
    <%@ Import Namespace="System.Data.SqlClient" %>
    <%@ Page Language="VB" %>
    <script runat="server">    Dim conNorthwind As SqlConnection
        Dim cmdSql As Sqlcommand
        Dim strSql As String
        
        Sub Page_Load
          conNorthwind = New SqlConnection("Server=localhost;UID=sa;PWD=;Database=Northwind")
          If Not IsPostBack Then
           BindDataGrid
          End If
        End Sub
        
        Sub BindDataGrid
          cmdSql = New SqlCommand("Select * From Products", conNorthwind )
          conNorthwind.Open()
          dgrdProducts.DataSource = cmdSql.ExecuteReader()
          dgrdProducts.DataBind()
          conNorthwind.Close()
        End Sub
        
        Sub drgdProducts_EditCommand( s As Object, e As DataGridCommandEventArgs)
          dgrdProducts.EditItemIndex = e.Item.ItemIndex
          BindDataGrid
        End Sub
        
        Sub dgrdProducts_UpdateCommand(s As Object,e As DataGridCommandEventArgs)
          Dim intProductID As Integer
          Dim txtUnitPrice As TextBox
          Dim decUnitPrice As Decimal
        
          If IsValid Then
            intProductID = dgrdProducts.DataKeys( e.Item.ItemIndex )
            txtUnitPrice = e.Item.FindControl("txtUnitPrice")
            decUnitPrice = txtUnitPrice.Text
            strSql = "Updata Products Set UnitPrice=@UnitPrice" _
            & "Where ProductID=@ProductID"
            cmdSql = New SqlCommand(strSql, conNorthwind )
            cmdSql.Parameters.Add("@UnitPrice",decUnitPrice )
            cmdSql.Parameters.Add("@ProductID",intProductID )
            conNorthwind.Open()
            cmdSql.ExecuteNonQuery()
            conNorthwind.Close()
            dgrdProducts.EditItemIndex = -1
            BindDataGrid
          End If
        End Sub
        
        Sub dgrdProducts_CancelCommand( s As Object, e As DataGridCommandEventArgs )
          dgrdProducts.EditItemIndex = -1
        End Sub</script>
    <html>
    <head>
    </head>
    <body>
        <form runat="server">
            <!-- Insert content here -->
            <asp:DataGrid id="dgrdProducts" runat="server" HeaderStyle-BackColor="Salmon" CellPadding="10" AutoGenerateColumn="False" DataKeyField="ProductID" OnCancelCommadn="dgrdProducts_CancelCommand" OnUpdateCommad="dgrdProducts_UpdateCommand" OnEditCOmmand="drgdProducts_EditCommand">
                <Columns>
                    <asp:BoundColumn HeaderText="Product Name" DataField="ProductName" ReadOnly="True" />
                    <asp:TemplateColumn>
                        <HeaderTemplate>
                            Price 
                        </HeaderTemplate>
                        <ItemTemplate>
                            <%# Container.DataItem("UnitPrice") %> 
                        </ItemTemplate>
                        <EditItemTemplate>
                            <asp:TextBox id="txtUnitPrice" Text='<%# Container.DataItem( "UnitPrice" ) %>' Runat="server" />
                            <asp:RequiredFieldValidator ControlToValidate="txtUnitPrice" Display="Dynamic" Text="Required!" Runat="Server" />
                            <asp:CompareValidator ControlToValidate="txtUnitPrice" Display="Dynamic" Text="Must be Currency!" Operator="DataTypeCheck" Type="Currency" Runat="Server" />
                            </EditItemTemplate>
                            </asp:TemplateColumn>
                    <asp:EditCommandColumn EditText="Edit!" UpdateText="Update!" CancelText="Cancel!" />
                    </Columns>
                    </asp:DataGrid>
            </form>
            </body>
            </html>
      

  3.   

    楼上的兄弟谢谢你了,可是我对vb一向头痛.....哪里有c#的代码呢
      

  4.   

    这是我的代码,一点问题没有,我也是花了好几天时间才搞定的,注意我程序中的代码注释,因为那一点非常重要。
    private void UpdateInvoice()
    {
    string Upt="UPDATE invoice SET 购货单位=@购货单位,日期=@日期,货名及规格=@货名及规格,单位=@单位,数量=@数量,单价=@单价,金额=@金额,已报销=@已报销,图片名称=@图片名称,备注=@备注 WHERE 编号=@编号";
    da.UpdateCommand=new OleDbCommand(Upt,conn);
    OleDbParameter Para;
    //下面这些参数添加的先后顺序一定要和SQL语句中的顺序一致,其中WHERE子句中的参数位于最后,也就是要严格一致才行!
    Para=da.UpdateCommand.Parameters.Add("@购货单位",OleDbType.Char);
    Para.SourceColumn="购货单位";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@日期",OleDbType.Char);
    Para.SourceColumn="日期";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@货名及规格",OleDbType.Char);
    Para.SourceColumn="货名及规格";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@单位",OleDbType.Char);
    Para.SourceColumn="单位";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@数量",OleDbType.Char);
    Para.SourceColumn="数量";
    Para.SourceVersion=DataRowVersion.Original;
    Para=da.UpdateCommand.Parameters.Add("@单价",OleDbType.Char);
    Para.SourceColumn="单价";
    Para.SourceVersion=DataRowVersion.Original;
    Para=da.UpdateCommand.Parameters.Add("@金额",OleDbType.Char);
    Para.SourceColumn="金额";
    Para.SourceVersion=DataRowVersion.Original;
    Para=da.UpdateCommand.Parameters.Add("@已报销",OleDbType.Char);
    Para.SourceColumn="已报销";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@图片名称",OleDbType.Char);
    Para.SourceColumn="图片名称";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@备注",OleDbType.Char);
    Para.SourceColumn="备注";
    Para.SourceVersion=DataRowVersion.Current;
    Para=da.UpdateCommand.Parameters.Add("@编号",OleDbType.BigInt);
    Para.SourceColumn="编号";
    Para.SourceVersion=DataRowVersion.Original;
    if(MessageBox.Show("你真的要保存对数据库所做的更改吗?","确认!",MessageBoxButtons.OKCancel,MessageBoxIcon.Question)==DialogResult.OK)
    {
    da.Update(ds,"invoice");
    dataGridInvoice.SetDataBinding(ds,"invoice");
    }
    }
      

  5.   

    坏了,才想起来,这段代码是我写的winform程序里datagrid的更新代码,在asp.net里不知道管不管用,你自己考虑一下看看能不能改一改就可以,不过估计不行。
      

  6.   

    如果DataGriD1.DataKeyFiled设为id的话,原因可能是:DataGrid1.DataKeys[(int)e.Item.ItemIndex]没有获得值
    确保id绑定在datagrid1上,
    而且id这一列不为空
    (int)(DataGrid1.DataKeys[(int)e.Item.ItemIndex]);另外:
    我觉得不如这样获得id的值,e.Item.cells(1)----1为id在datagrid1的一行的位置索引
    Comm.Parameters["@Id"].Value = (int)e.Item.cells(1)
      

  7.   

    感谢各位朋友的关注, id是帮定在datagrid1上的,而且是一个自动增加的序号列,值是肯定有的,我跟踪过了问题就是这一句DataGrid1.DataKeys[(int)e.Item.ItemIndex];提示索引超出范围。必须为非负值并小于集合大小。参数名:index .集合大小难道有各限定吗,可是编辑,取消,删除功能却毫无问题呀