使用模板列获取批量获取DataGrid中的数据
在数据的管理中常常需要批量地获取数据或者对数据进行更新删除。使用DataGrid控件的模板列可以方便地实现这一目的。以下是我写的一个批量在分页的DataGrid中获取表格中数据的简单实现思想。
test.aspx
.................................
<asp:DataGrid id="dgResult" runat="server" BorderColor="#DEBA84" BorderStyle="None" CellSpacing="2"
BorderWidth="1px" BackColor="#DEBA84" CellPadding="3" PageSize="20" AllowPaging="True">
<FooterStyle ForeColor="#8C4510" BackColor="#F7DFB5"></FooterStyle>
<SelectedItemStyle Font-Bold="True" ForeColor="White" BackColor="#738A9C"></SelectedItemStyle>
<ItemStyle ForeColor="#8C4510" BackColor="#FFF7E7"></ItemStyle>
<HeaderStyle Font-Bold="True" ForeColor="White" BackColor="#A55129"></HeaderStyle>
<Columns>
<asp:TemplateColumn HeaderText="选择">
<ItemTemplate>
<asp:CheckBox Runat="server" Enabled="True" ID="ck"></asp:CheckBox>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
<PagerStyle HorizontalAlign="Center" ForeColor="#8C4510" Position="TopAndBottom" Mode="NumericPages"></PagerStyle>
</asp:DataGrid>
.............................
test.aspx.cs
.................................
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!Page.IsPostBack)
{
string path =@"E:/mp3";
if(path!=null)
{
strSearch=@"*.*";
GetFileName(@path,strSearch);
mfbind(this.DataSource(rArr));
}
else
lblProblem.Text="数据读取错误!";
}
}
private IList DataSource(ArrayList rArr)
{
DataTable dt=new DataTable();
DataColumn dc=new DataColumn();
dc.ColumnName="文件序号";
dc.DataType=System.Type.GetType("System.Int32");
dc.ReadOnly=true;
dc.Unique=true;
dc.AutoIncrement=true;
dc.AutoIncrementSeed=0;
dc.AutoIncrementStep=1;
dt.Columns.Add(dc);
dc=new DataColumn();
dc.ColumnName="文件路径";
dc.DataType=System.Type.GetType("System.String");
dt.Columns.Add(dc);
for(int i=0;i<rArr.Count;i++)
{
DataRow dr=dt.NewRow();
dr[1]=rArr[i].ToString();
dt.Rows.Add(dr);
}
Session["Source"] = dt;
return dt.DefaultView;
}
private void mfbind(IList dv)
{
this.dgResult.DataSource=(DataView)dv;
this.dgResult.DataBind();
}
private void btnImport_Click(object sender, System.EventArgs e)
{
ArrayList resultArr=GetODBFileList();
for(int i=0;i<resultArr.Count;i++)
InsertFileData((string)resultArr[i]);
}
private ArrayList GetODBFileList()
{
ArrayList mArr1=new ArrayList();
int j=dgResult.Items.Count;
if(dgResult.Items.Count==20)
j=20;
for(int i=0;i<j;i++)
{
if(((CheckBox)dgResult.Items[i].FindControl("ck")).Checked)
mArr1.Add(dgResult.Items[i].Cells[2].Text);
}
return mArr1;
}
private void InsertFileName(string fname)
{
strConn=GetDBConfig();
Conn=new SqlConnection(strConn);
strCmd="INSERT INTO FileInfo(fName)Values('"+fname+"') ";
cmd =new SqlCommand(strCmd,Conn);
try
{
Conn.Open();
cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
ExpErrorLog errLog=new ExpErrorLog(ErrLogFileName,ex.Source+" : "+ex.Message);
}
finally
{
if(Conn.State!=ConnectionState.Closed)
Conn.Close();
}
}
..............................
我写这些代码的目的是作一个能批量获取Table中数据的程序。那么实现的思想是首先将需要获取数据的表格作为DataGrid的数据绑定源。通过设置DataGrid的模板列在其中加入ID="col"的服务器端控件。在运行时使用FindControl方法获取DataGrid中相应控件的数据。上面的程序只是针对获取一个控件数据而编写的,如果需要增加控件的数目只要再添加一个for循环就可以批量获取二维控件组(就是由控件形成的二维矩阵结构,不知如何表达)的数据。而整个数据的获取过程需要通过一个事件的触发而完成对所有控件数据的扫描。
for(int j=0;i<10;i++)
{
for(int i=0;i<10;i++)
{
txt=new TextBox();
if(((CheckBox)dgResult.Items[i].FindControl("ck")).Checked)
mArr1.Add(dgResult.Items[i].Cells[2].Text);
}
}
我认为这段程序有共通性,是指如果将其中的CheckBox控件换成其他控件就可以获取其他类型的数据。用CheckBox控件可以通过对整个DataGrid的扫描获取其中有几行数据是Checked,那么也就可以获取表格中的数据。
若是批量更新,可以将数据绑定在各个控件上,然后添加一个Button按钮,使用Button_Click事件触发对整个DataGrid中控件数据的扫描。不过这个我没有试过。
还有就是Pager的问题,其实for(int i=0;i<10;i++)中的10可以换成你Pager的行数,若设定的每页20行那么就可以这样设置
ArrayList mArr=new ArrayList()
int j=dgResult.Items.Count;
if(dgResult.Items.Count==20)
j=20;
for(int i=0;i<j;i++)
{
if(((CheckBox)dgResult.Items[i].FindControl("ck")).Checked)
mArr.Add(dgResult.Items[i].Cells[2].Text);
}
这样就可以获取每一页中的具体控件的数据,不过这样是不能获取其他页面中选中的数据。