เกิด error :: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection
value ใน num คงเกิน length ของ gridview
เอาโค้ดทั้ง method มาดูดิ๊ ว่ากำลังจะทำอะไร
จะอ้าง key หรือ index ทำไมเขียนแบบนี้ล่ะ
Date :
2010-09-17 13:39:28
By :
tungman
เรื่องก็มีอยู่ว่า...........
ต้องการให้ OnClick="btnSubmit" แล้ว lableIndex.Text ใน myGridView_RowDataBound ส่งค่าไปด้วยค่ะ
เพื่อจะได้รู้ว่า เป็น Rows อะไร ( Label ID = (Label)myGridView.Rows[.......].FindControl("lblID"); )
งงมั้ยค่ะ
Code (C#)
protected void myGridView_RowDataBound(Object s, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
int f = e.Row.RowIndex + 1;
Label lableIndex = (Label)(e.Row.FindControl("lableIndex"));
lableIndex.Text = f.ToString();
}
}
Code (C#)
<asp:TemplateField >
<ItemTemplate>
<asp:Button id="Button1" runat="server" Text="บันทึก" OnClick="btnSubmit" BackColor="Silver" BorderColor="LightGray"
BorderStyle="Solid" Height="30px" Width="50px" ></asp:Button>
</ItemTemplate>
</asp:TemplateField>
Code (C#)
protected void btnSubmit(Object sender, EventArgs e)
{
Label ID = (Label)myGridView.Rows[.......].FindControl("lblID");
}
ตามรูปนี้
ประวัติการแก้ไข 2010-09-17 16:07:19
Date :
2010-09-17 16:04:31
By :
alonewin
อันนี้ความคิดผมนะ และก็ผมใช้ปฎิบัติเป็นปกติด้วย คือ
ผมจะไม่ค่อยใช้ templatfield หรอกถ้าไม่จำเป็นจริงๆ
ถ้า field ไหนเป็น checkbox มันก็มี checkboxfield
field ไหนเป็น button มันก็มี commandfield
ส่วนที่ใช้แค่แสดงผลอย่างเดียวก็ใช้ boundfield
เพราะว่าเวลา bind data ทำได้ง่ายกว่า ไม่ต้องไป bind แบบ inline
หรือถ้าจะ bind ที่ code behide ก็ไม่ต้องไป find control สามารถกำหนด field กับ column แล้ว bind ได้เลย
และการใช้ command event ก็ง่าย เพราะสามารถระบุ index หรือ datakey ได้ด้วย eventargs
ฉะนั้นเขียนแบบนี้ยากตายเลย
Date :
2010-09-17 19:27:38
By :
tungman
MyGridView.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MyGridView.aspx.cs" Inherits="MyGridView" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333"
GridLines="None">
<AlternatingRowStyle BackColor="White" />
<EditRowStyle BackColor="#2461BF" />
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="#EFF3FB" />
<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
<SortedAscendingCellStyle BackColor="#F5F7FB" />
<SortedAscendingHeaderStyle BackColor="#6D95E1" />
<SortedDescendingCellStyle BackColor="#E9EBEF" />
<SortedDescendingHeaderStyle BackColor="#4870BE" />
<Columns>
<asp:TemplateField HeaderText="#">
<ItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText="Index" />
<asp:BoundField HeaderText="Pet" DataField="Pet" />
<asp:TemplateField HeaderText="Cost">
<ItemTemplate>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField HeaderText="Save" ButtonType="Button" ShowSelectButton="true" ShowEditButton="false" ShowDeleteButton="false" SelectText="บันทึก" />
</Columns>
</asp:GridView>
</div>
</form>
</body>
</html>
MyGridView.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
public partial class MyGridView : System.Web.UI.Page
{
protected void Page_Init(object sender, EventArgs e)
{
GridView1.SelectedIndexChanging += new GridViewSelectEventHandler(GridView1_SelectedIndexChanging);
GridView1.RowDataBound += new GridViewRowEventHandler(GridView1_RowDataBound);
}
protected void Page_Load(object sender, EventArgs e)
{
GridView1.AutoGenerateColumns = false;
GridView1.DataSource = GetPetData();
GridView1.DataKeyNames = new string[] { "ID" };
GridView1.DataBind();
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
DataRowView Drv = (DataRowView)e.Row.DataItem;
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Cells[1].Text = (e.Row.RowIndex + 1).ToString();
((TextBox)e.Row.FindControl("TextBox1")).Text = Drv["Cost"].ToString();
}
}
protected void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
{
// update datebase here with
// int datakey = (int)GridView1.DataKeys[e.NewSelectedIndex].Value;
}
protected DataTable GetPetData()
{
// สมมุติว่า query จาก database ตรงนี้แล้วกันนะ
string[] Pet = new string[] { "Dog", "Cat", "Bird", "Fish", "Dinosaur" };
int[] Cost = new int[] { 1000, 1500, 500, 120, 5000 };
DataTable Dt = new DataTable();
Dt.Columns.Add(new DataColumn("ID", typeof(int)));
Dt.Columns.Add(new DataColumn("Pet", typeof(string)));
Dt.Columns.Add(new DataColumn("Cost", typeof(int)));
for (int i = 0; i < 5; i++)
{
DataRow Dr = Dt.NewRow();
Dr["ID"] = i + 1;
Dr["Pet"] = Pet[i];
Dr["Cost"] = Cost[i];
Dt.Rows.Add(Dr);
}
return Dt;
}
}
ประวัติการแก้ไข 2010-09-17 20:24:21
Date :
2010-09-17 20:18:38
By :
tungman
Load balance : Server 02