已解决

【精华】如何开发出更好的“gridview”控件?已解决

学员:徐豫锋提问时间:2008-10-08 15:57:26

总感觉gridview控件功能不够,如何在gridview基础上,开发更好功能的控件?
要求支持:全选、ctrl(多个)和shift(连续)的选择。

采纳为答案

回答人:金旭亮回答时间:2008-10-09 17:06:40

amandag(高歌 .NET学习顾问)说得很对,GridView有许多功能和特效都可以通过模板列+JavaScript+CSS实现,再加一点补充,如果有服务器端功能的配合(比如利用AJAX直接调用Web Server端发布的Web Service或ASP.NET页面静态类方法),则功能完全可以逼近桌面应用程序中类似控件的功能,但要完成这些工作其开发量是较大的(比如往往要动态向页面注入JavaScript代码,调试JavaScript代码是件很头痛的事情,比调试C#代码难多了,而且还要考虑到浏览器的版本和种类问题)。不过,下功夫做好一个以后,可以将其封装为Web服务器端控件,以后再用就简单多了。
最近研究了一下XAML,要实现功能和界面都很Cool的控件很容易,它的开发效率与灵活性是传统Web开发方法所不能比拟的(开发一个实现现有桌面GridView功能的控件是件小Case)。我个人认为,现有的Web开发技术(尤其是表示层的技术)有很大的局限,一定会被替换掉的,但最终由哪种技术占据主流还很难说,因为互联网实在太大了,从PC到手机再到各种智能设备,也许根本就很难有一种表示层技术能“一统天下”。微软的Silverlight以XAML作为界面描述语言,是下一代互联网应用程序表示层技术的有力竞争者。

学员对该答案的评价 谢谢,指导

其他回答

回答人:程飞回答时间:2008-10-08 16:29:31
你可以加个模板列啊
里面放个checkbox
你还可以给每行加个js函数ONCLICK
点击行就可以选中或反选
我认为WEB设计光会.NET那是很鸡肋的
加上CSS和JAVASCRIPT(AJAX)后才能真正的做出很好的效果
回答人:amandag(高歌 .NET学习顾问)回答时间:2008-10-08 20:18:59
一般web应用程序的全选、ctrl和shift功能都是用CheckBox去实现的,因为毕竟不是windows应用程序,控制起来没那么方便
回答人:polarstar (.NET学习顾问)回答时间:2008-10-08 21:05:18
我在一个项目中实现过,不过项目很大,我给你关键实现代码吧:
我实现的是全选、反选,单选直接点击就可以了,ctrl和shift不是很好实现
关键代码我贴出来,加以研究应该可以实现,实现了告诉我一声,呵呵。
1。gridview代码(原来的代码很复杂,我删掉了很大一部分,你只要关注CheckBox那列就可以了):
<asp:GridView ID="gridViewInitializeRegistor" Width="100%" runat="server" BorderStyle="Solid"
AutoGenerateColumns="False" AllowPaging="True" OnPageIndexChanging="gridViewInitializeRegistor_PageIndexChanging"
PageSize="30" OnRowDataBound="gridViewInitializeRegistor_RowDataBound" EmptyDataText="没有记录">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText="序号" />
<asp:TemplateField HeaderText="姓名">
<ItemTemplate>
<asp:HyperLink ID="hlName" runat="server" Target="_blank" NavigateUrl='<%#"~/General/InitializeRegistorView.aspx?cid="+DataBinder.Eval(Container,"DataItem.EngineerMajordomo.CertificateID").ToString() %>' Text='<%# DataBinder.Eval(Container,"DataItem.EngineerMajordomo.Name") %>'></asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="性别">
<ItemTemplate>
<asp:Label ID="Label3" runat="server" Text='<%# DataBinder.Eval(Container,"DataItem.EngineerMajordomo.Sex") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
回答人:polarstar (.NET学习顾问)回答时间:2008-10-08 21:05:37
2。全选和反选按钮(这里不关联事件,我要在数据绑定的时候关联事件,这样才能把数据关联的一些信息告诉javascript):
<span>
<asp:Button ID="btnCheckAll" runat="server" Text="全选" Width="80px" /></span>
<span style="padding-left: 6px;">
<asp:Button ID="btnAntiCheckAll" runat="server" Text="反选" Width="80px" /></span>
3。每次动态绑定数据后,创建按钮事件关联:
//动态绑定gridview
this.gridViewInitializeRegistor.DataSource = lstInitRegistor;
this.gridViewInitializeRegistor.DataBind();
//关联“全选”、“反选”事件
this.btnCheckAll.OnClientClick = "AuditCheckAll('" + this.gridViewInitializeRegistor.Rows.Count.ToString() + "','gridViewInitializeRegistor');return false;";
this.btnAntiCheckAll.OnClientClick = "AuditAntiCheckAll('" + this.gridViewInitializeRegistor.Rows.Count.ToString() + "','gridViewInitializeRegistor');return false;";
4。执行javascript进行“全选”和“反选”,这两个函数放在js文件中(在这里我投机了一把,因为gridview外层有一个ContentPlaceHolder,所以每个CheckBox最后生成的静态HTML的ID可以计算出来,这样js才可以正确访问):
function AuditCheckAll(count,gridview)
{
for(var i = 2,j=0;j < count;i ++,j++)
{
if(i < 10)
{
document.getElementById('ctl00_ContentPlaceHolder1_'+gridview+'_ctl0'+i+'_CheckBox1').checked=true;
}
else
{
document.getElementById('ctl00_ContentPlaceHolder1_'+gridview+'_ctl'+i+'_CheckBox1').checked=true;
}
}
}
function AuditAntiCheckAll(count,gridview)
{
for(var i = 2,j=0;j < count;i ++,j++)
{
if(i < 10)
{
var auditCheckBox = document.getElementById('ctl00_ContentPlaceHolder1_'+gridview+'_ctl0'+i+'_CheckBox1');
auditCheckBox.checked=!auditCheckBox.checked;
}
else
{
var auditCheckBox = document.getElementById('ctl00_ContentPlaceHolder1_'+gridview+'_ctl'+i+'_CheckBox1');
auditCheckBox.checked=!auditCheckBox.checked;
}
}
}
回答人:polarstar (.NET学习顾问)回答时间:2008-10-08 21:08:05
javascript用的好,Gridview可以实现很漂亮的效果,不过不是三言两语可以说清楚的,要去实践和尝试,呵呵。
回答人:徐豫锋回答时间:2008-10-08 21:27:41
我是看了QQ邮箱才想到应该能实现我所说的功能
高手们看看能不能实现
不一定非要用gridview,反正实现效果就好了。。。
回答人:徐豫锋回答时间:2008-10-08 21:29:34
建议专门开一个windows控件开发的课程吧,学了就要学通,面前实际应用,我是可以考虑加学费的,有同样想法的人请回帖