我有网格视图的aspx代码如下..
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
任何人都可以帮我解决这个问题吗?
史蒂夫 - &gt;根据你的问题,我改变了我的逻辑如下
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代码生成以下输出 - &gt;更新machinedetails set machinename ='2',active ='0'其中machineno = 2
machinename ='2'应该是我在文本框中输入的值。下拉列表值正确无误。
答案 0 :(得分:0)
我通过将所有字段转换为温和字段来解决此问题。但仍然不知道为什么会这样。
答案 1 :(得分:0)
我想我可以解释为什么你在MachineNo
中获得了mname
的价值。
你说的是:
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." />