2013-03-15 57 views
0

我有网格视图ASPX代码如下..在编辑gridview的我得到空datakeys以及空新值

ASPX

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        AutoGenerateEditButton="True" BackColor="White" BorderColor="#CC9966" 
        BorderStyle="None" BorderWidth="1px" CellPadding="4" 
        DataKeyNames="Machine no." EnableModelValidation="True" 
        onrowcancelingedit="GridView1_RowCancelingEdit" 
        onrowediting="GridView1_RowEditing" onrowupdating="GridView1_RowUpdating"> 
        <Columns> 
         <asp:BoundField DataField="Machine no." HeaderText="Machine no." 
          ReadOnly="True" SortExpression="Machine no." /> 
         <asp:BoundField DataField="Machine Name" HeaderText="Machine Name" 
          SortExpression="Machine Name" /> 
         <asp:TemplateField HeaderText="Is active?" SortExpression="Is active?"> 
          <ItemTemplate> 
           <asp:Label ID="Label1" runat="server" Text='<%# Bind("[Is active?]") %>'></asp:Label> 
          </ItemTemplate> 
          <EditItemTemplate> 
           <asp:DropDownList ID="DropDownList1" runat="server" 
            SelectedValue='<%# Bind("[Is active?]") %>'> 
            <asp:ListItem Value="0">Inactive</asp:ListItem> 
            <asp:ListItem Value="1">Active</asp:ListItem> 
           </asp:DropDownList> 
          </EditItemTemplate> 
         </asp:TemplateField> 
        </Columns> 
        <FooterStyle BackColor="#FFFFCC" ForeColor="#330099" /> 
        <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="#FFFFCC" /> 
        <PagerStyle BackColor="#FFFFCC" ForeColor="#330099" HorizontalAlign="Center" /> 
        <RowStyle BackColor="White" ForeColor="#330099" /> 
        <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="#663399" /> 
       </asp:GridView> 

我在后面的代码所定义的逻辑如下..

代码隐藏

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
      bindgrid(); 
    } 

} 
void bindgrid() 
{ 
    string q = "SELECT machineno AS 'Machine no.',machinename AS 'Machine Name',active AS 'Is active?' FROM machinedetails"; 
    DataTable dt = dtu.table(q, out error); 
    GridView1.DataSource = dt; 
    GridView1.DataBind(); 
} 
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    GridView1.EditIndex = e.NewEditIndex; 
    bindgrid(); 
} 
protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) 
{ 
    GridView1.EditIndex = -1; 
    bindgrid(); 
} 
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    string mno = e.Keys[0].ToString(); 
    string mname = e.NewValues[0].ToString(); 
    string active = e.NewValues[1].ToString(); 
    string q = "update machinedetails set machinename = '"+mname+"',active='"+active+"' where machineno =" + mno; 
    Response.Write(q); 
    e.Cancel=true; 
    GridView1.EditIndex = -1; 
    bindgrid(); 
} 

但它引发错误: -

Index was out of range. Must be non-negative and less than the size of the collection. 
    Parameter name: index 

任何一个可以帮我这个?

史蒂夫 - >按你的问题,我改变了我的逻辑如下

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    string mno = GridView1.DataKeys[e.RowIndex][0].ToString(); 
    GridView gv = (GridView)sender; 
    for (int i = 0; i < gv.Columns.Count; i++) 
    { 
      DataControlFieldCell cell = gv.Rows[e.RowIndex].Cells[i] as DataControlFieldCell; 
      gv.Columns[i].ExtractValuesFromCell(e.NewValues, cell, DataControlRowState.Edit, true); 
    } 
    string mname = e.NewValues[0].ToString(); 
    string active = e.NewValues[1].ToString(); 
    string q = "update machinedetails set machinename = '" + mname + "',active='" + active + "' where machineno =" + mno; 
    Response.Write(q); 
    e.Cancel=true; 
    GridView1.EditIndex = -1; 
    bindgrid(); 
} 

现在我没有得到任何错误,但MNAME来了一样datakey 我的Response.Write代码produse以下输出 - > update machinedetails set machinename ='2',active ='0'where machineno = 2

machinename ='2'应该是我在文本框中输入的值。 Dropdownlist值正确。

+0

你的哪行代码抛出异常? – 2013-03-15 12:05:49

+0

string mno = e.Keys [0] .ToString();抛出错误以及tring mname = e.NewValues [0] .ToString();基本上所有的值都是空的。 – Ratna 2013-03-15 12:06:54

+0

使用intellisense,在这些行上放置一个断点,然后查看属性。 – 2013-03-15 12:10:08

回答

0

我已经通过将所有字段转换为温和字段来解决此问题。但仍不知道为什么会发生这种情况。

0

我想我可以解释为什么你在mname中得到MachineNo的值。

你说:

for (int i = 0; i < gv.Columns.Count; i++) 
{ 
     DataControlFieldCell cell = gv.Rows[e.RowIndex].Cells[i] as DataControlFieldCell; 
     gv.Columns[i].ExtractValuesFromCell(e.NewValues, cell, DataControlRowState.Edit, true); 
} 

那你说

string mname = e.NewValues[0].ToString(); 

但什么是进入Column[0]?它是Machine No

<asp:BoundField DataField="Machine no." HeaderText="Machine no."        ReadOnly="True" SortExpression="Machine no." /> 
+0

由于列0是只读的,因此e.NewValues [0]将保存单元[1]的值。 – Ratna 2013-03-16 04:40:58

+0

但您将True传递给'ExtractValuesFromCell'方法,该方法指示只读字段应该包含在集合中。请参阅:http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.datacontrolfield.extractvaluesfromcell.aspx – 2013-03-16 17:26:32