2004-7-21/22+ DataGrid知识整理
文件是mssql解决方案里的datagrid程序。
DataGrid的基本结构整理:
<asp:datagrid id="dgsy" runat="server" ForeColor="Black" BackColor="White" BorderWidth="1px" BorderStyle="Solid"
GridLines="Vertical" CssClass="dg1" CellPadding="3" BorderColor="#999999" AllowSorting="True"
AutoGenerateColumns="False" PageSize="7" AllowPaging="True">
<SelectedItemStyle Font-Bold="True" ForeColor="White" BackColor="#000099"></SelectedItemStyle>
<AlternatingItemStyle BackColor="#CCCCCC"></AlternatingItemStyle>
<HeaderStyle Font-Bold="True" ForeColor="White" BackColor="Black"></HeaderStyle>
<FooterStyle BackColor="#CCCCCC"></FooterStyle>
<Columns>
<asp:BoundColumn DataField="named" HeaderText="机体名称" SortExpression="named"></asp:BoundColumn>
<asp:BoundColumn DataField="act" HeaderText="所属作品" SortExpression="act"></asp:BoundColumn>
<asp:BoundColumn DataField="id" HeaderText="编号"></asp:BoundColumn>
<asp:HyperLinkColumn DataNavigateUrlField="id" DataNavigateUrlFormatString="cc.aspx?id={0}" DataTextField="id"
HeaderText="连接"></asp:HyperLinkColumn>
<asp:ButtonColumn Text="详细" HeaderText="操作" CommandName="more"></asp:ButtonColumn>
<asp:EditCommandColumn ButtonType="LinkButton" UpdateText="更新" CancelText="取消" EditText="编辑"></asp:EditCommandColumn>
<asp:ButtonColumn Text="删除" CommandName="Delete"></asp:ButtonColumn>
</Columns>
<PagerStyle HorizontalAlign="Center" ForeColor="Black" BackColor="#999999" Mode="NumericPages"></PagerStyle>
</asp:datagrid>
其中分页和删除、编辑列都是通过属性生成器完成的,BoundColumn为自定义列时需要使用的,在这里可以自己定义headertext,但必须要把AutoGenerateColumns的值设为flase。如果要进行排序的话,就必须要指定SortExpression,这是用来排序的数据表的列名。
相对应的事件处理方法都是在属性面板的事件栏里进行操作。
<asp:HyperLinkColumn DataNavigateUrlField="id" DataNavigateUrlFormatString="cc.aspx?id={0}" DataTextField="id"
HeaderText="连接"></asp:HyperLinkColumn>这是超级连接的列的设置办法。DataNavigateUrlField是连接里变量参数的值,指的是数据库里的相应的列。DataNavigateUrlFormatString是连接字符串,其中有一个参数,这个位置的值就是DataNavigateUrlField,DataTextField是用来在页面上显示的字符,也是相对应的数据库里的相应的列。
数据绑定到datagrid
DataSet ds=new DataSet();
ada.Fill(ds,"mss");
DataView dv=ds.Tables["mss"].DefaultView;
dv.Sort=(string)ViewState["SortField"];
dgsy.DataSource=dv;
dgsy.DataBind();
这是绑定时的部分代码,注意这里用了DataView,这个还没有研究,另外加了一个排序时需要的功能dv.Sort,后面接收的值在排序事件处理时给予。
dgsy.EditItemIndex=e.Item.ItemIndex;
setup();
这是处理编辑事件时的代码,可以看到,和datalist差不多
删除事件
int ids=Int32.Parse(e.Item.Cells[2].Text);
string sqldel="delete from ms where id="+ids;
处理删除时用的,和datalist真的差不多,e.Item.Cells[2]是指触发事件的datagrid的那一行的第二列的值,这里就是一个id,然后再根据id把记录删了
int ids=Int32.Parse(((TextBox)(e.Item.Cells[2].Controls[0])).Text);
这个id的获取就不一样了,因为这是在处理update时,datagrid那一行都变成textbox了,所以要进行格式的转换,另外e.Item.Cells[2].Controls[0]表示这个行列的第一个控件,自然就是我们需要的textbox
相关值的获取
dr["named"]=((TextBox)(e.Item.Cells[0].Controls[0])).Text;
dr["act"]=((TextBox)(e.Item.Cells[1].Controls[0])).Text;
ada.Update(ds,"mss");
具体的处理过程。
关于分页,这个如果用datareader就麻烦了,需要自己指定,但是dataset就可以作到一个allowpaging就可以搞定。
默认分页
dgsy.CurrentPageIndex=e.NewPageIndex;
setup();
处理页码改变的代码
注意的是,不管你的pagesize是多少,在一开始的时候都是把所有的记录都调出来,然后再进行下一步操作,所以对资源的浪费是肯定的,在这里有一个好的办法就是用自定义分页,就是AllowCustomPaging="True",关于这个我学会了一点,呆会就写个东西上来。
处理事件冲突的办法
还有,如果ButtonColumn和EditCommandColumn同时使用,单击EditCommandColumn中的按钮时,除激发响应的编辑、取消、更新等事件外,还会激发ItemCommand事件,这意味着有两个事件处理程序被执行。(注意,在datalist里也存在这样的情况。)
解决的办法是定义ButtonColumn的commandname或commandargument属性,在ItemCommand事件中先判断命令源的commandname或commandargument,再执行响应的操作。下面是相应的代码
//点击事件发生时的事件
private void dgsy_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
if(e.CommandName=="more")
{
//获得返回的tablerow对象
TableRow tr=e.Item;
//获得tablecell的数据
string s=tr.Cells[2].Text;
Response.Write(s);
setup();
}
}
基本就这些了。或许应该把图书馆里的那本书拿过来好好研究研究。
DataGrid的基本结构整理:
<asp:datagrid id="dgsy" runat="server" ForeColor="Black" BackColor="White" BorderWidth="1px" BorderStyle="Solid"
GridLines="Vertical" CssClass="dg1" CellPadding="3" BorderColor="#999999" AllowSorting="True"
AutoGenerateColumns="False" PageSize="7" AllowPaging="True">
<SelectedItemStyle Font-Bold="True" ForeColor="White" BackColor="#000099"></SelectedItemStyle>
<AlternatingItemStyle BackColor="#CCCCCC"></AlternatingItemStyle>
<HeaderStyle Font-Bold="True" ForeColor="White" BackColor="Black"></HeaderStyle>
<FooterStyle BackColor="#CCCCCC"></FooterStyle>
<Columns>
<asp:BoundColumn DataField="named" HeaderText="机体名称" SortExpression="named"></asp:BoundColumn>
<asp:BoundColumn DataField="act" HeaderText="所属作品" SortExpression="act"></asp:BoundColumn>
<asp:BoundColumn DataField="id" HeaderText="编号"></asp:BoundColumn>
<asp:HyperLinkColumn DataNavigateUrlField="id" DataNavigateUrlFormatString="cc.aspx?id={0}" DataTextField="id"
HeaderText="连接"></asp:HyperLinkColumn>
<asp:ButtonColumn Text="详细" HeaderText="操作" CommandName="more"></asp:ButtonColumn>
<asp:EditCommandColumn ButtonType="LinkButton" UpdateText="更新" CancelText="取消" EditText="编辑"></asp:EditCommandColumn>
<asp:ButtonColumn Text="删除" CommandName="Delete"></asp:ButtonColumn>
</Columns>
<PagerStyle HorizontalAlign="Center" ForeColor="Black" BackColor="#999999" Mode="NumericPages"></PagerStyle>
</asp:datagrid>
其中分页和删除、编辑列都是通过属性生成器完成的,BoundColumn为自定义列时需要使用的,在这里可以自己定义headertext,但必须要把AutoGenerateColumns的值设为flase。如果要进行排序的话,就必须要指定SortExpression,这是用来排序的数据表的列名。
相对应的事件处理方法都是在属性面板的事件栏里进行操作。
<asp:HyperLinkColumn DataNavigateUrlField="id" DataNavigateUrlFormatString="cc.aspx?id={0}" DataTextField="id"
HeaderText="连接"></asp:HyperLinkColumn>这是超级连接的列的设置办法。DataNavigateUrlField是连接里变量参数的值,指的是数据库里的相应的列。DataNavigateUrlFormatString是连接字符串,其中有一个参数,这个位置的值就是DataNavigateUrlField,DataTextField是用来在页面上显示的字符,也是相对应的数据库里的相应的列。
数据绑定到datagrid
DataSet ds=new DataSet();
ada.Fill(ds,"mss");
DataView dv=ds.Tables["mss"].DefaultView;
dv.Sort=(string)ViewState["SortField"];
dgsy.DataSource=dv;
dgsy.DataBind();
这是绑定时的部分代码,注意这里用了DataView,这个还没有研究,另外加了一个排序时需要的功能dv.Sort,后面接收的值在排序事件处理时给予。
dgsy.EditItemIndex=e.Item.ItemIndex;
setup();
这是处理编辑事件时的代码,可以看到,和datalist差不多
删除事件
int ids=Int32.Parse(e.Item.Cells[2].Text);
string sqldel="delete from ms where id="+ids;
处理删除时用的,和datalist真的差不多,e.Item.Cells[2]是指触发事件的datagrid的那一行的第二列的值,这里就是一个id,然后再根据id把记录删了
int ids=Int32.Parse(((TextBox)(e.Item.Cells[2].Controls[0])).Text);
这个id的获取就不一样了,因为这是在处理update时,datagrid那一行都变成textbox了,所以要进行格式的转换,另外e.Item.Cells[2].Controls[0]表示这个行列的第一个控件,自然就是我们需要的textbox
相关值的获取
dr["named"]=((TextBox)(e.Item.Cells[0].Controls[0])).Text;
dr["act"]=((TextBox)(e.Item.Cells[1].Controls[0])).Text;
ada.Update(ds,"mss");
具体的处理过程。
关于分页,这个如果用datareader就麻烦了,需要自己指定,但是dataset就可以作到一个allowpaging就可以搞定。
默认分页
dgsy.CurrentPageIndex=e.NewPageIndex;
setup();
处理页码改变的代码
注意的是,不管你的pagesize是多少,在一开始的时候都是把所有的记录都调出来,然后再进行下一步操作,所以对资源的浪费是肯定的,在这里有一个好的办法就是用自定义分页,就是AllowCustomPaging="True",关于这个我学会了一点,呆会就写个东西上来。
处理事件冲突的办法
还有,如果ButtonColumn和EditCommandColumn同时使用,单击EditCommandColumn中的按钮时,除激发响应的编辑、取消、更新等事件外,还会激发ItemCommand事件,这意味着有两个事件处理程序被执行。(注意,在datalist里也存在这样的情况。)
解决的办法是定义ButtonColumn的commandname或commandargument属性,在ItemCommand事件中先判断命令源的commandname或commandargument,再执行响应的操作。下面是相应的代码
//点击事件发生时的事件
private void dgsy_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
if(e.CommandName=="more")
{
//获得返回的tablerow对象
TableRow tr=e.Item;
//获得tablecell的数据
string s=tr.Cells[2].Text;
Response.Write(s);
setup();
}
}
基本就这些了。或许应该把图书馆里的那本书拿过来好好研究研究。