故事背景:
现在的项目中有块需要做DataGrid中的数据更新和删除!在DataGrid的上方有两个TextBox用来新建记录!并且两个TextBox中的项目是必填项目,所有用了两个RequiredValidator加以约束.
引子:
功能如此的简单以至于我用了**点时间就搞定了,添加删除更新都没有任何问题于是禁不住有点暗自得意!
后来一想现在的功能模块是维护一个简单的字典表两个TextBox中的项目应该为必填项目,虽然客户那里并没有提出这个问题(客户说来一般比较弱智^_^),为了展示一个自己的思维缜密我加了两个RequiredValidator验证,删除按钮为了用所谓的xp风格所以放到了模板列中,我自己设置了CauseValidation为false,这点我还是能够想到的
修改后的再测试是我的一个习惯,Add,Delete操作no problem !当我点编辑的时候心里想着百分之九十应该怎么问题!但是当我点下更新按钮时,我必须承认我是一个很不幸的人,为什么那么小的几率我总是会碰上!百分之十的可能性如果碰到我会扩大再扩大然后到百分之百,当然我说的十坏事!好事则相反,这也是我从来不买彩票,从来不参与抓奖的原因!^_^,扯远了.
情节:
我很熟练的按了下shift+f7打开了aspx页面,试图在列的属性里找到CauseValidation,但是仔细找过后一无所获!接着就按F7,想着在CodeBehind里做点文章,但是结果很显然,地球人都知道!
I am a failure !
没办法我只能靠搜索引擎了,很习惯的我比较喜欢直接上csdn !关键字CauseValidation,searching......!还好,找到两篇!其中有思归老大的回答,大体思路就是把其中的cell[n].control[n]转化为Button !
Dim t As DataGridItem = dgdScoreshow.Items(e.Item.ItemIndex)
Dim k As LinkButton = CType(t.Cells(0).Controls(0), LinkButton)
k.CausesValidation = False
当然他的代码是c#的,我我把思归的代码搬了过来但是不能用!莫非思归的代码有错误,虽然我并不迷信别人,但是他的代码总是有来由的吧!
我突然想我把那个Control打印出来看看什么类型不就清楚了,于是我加了下面的代码 Response.Write("EditCommandColumn " + t.Cells(0).Controls(0).GetType.ToString + "<br>"),运行一把!打印出的是System.Web.UI.WebControls.DataGridLinkButton!
我窃喜!,这不就可以了!
Dim button As DataGridLinkButton
说DataGridLinkButton是"private"的,在上下文中不可访问.
我倒!
那转化为基类总可以吧!基类是什么东西啊?
可能是LinkButton吧!我这样想.
尝试一下就知道了.
于是我写下了下面的代码.
Dim bt As LinkButton = CType(dgdScoreshow.Items(e.Item.ItemIndex).Cells(0).Controls(0), LinkButton)
bt.CausesValidation = False
Ctrl+F5,果然不错我所料!
于是我就想,思归为什么写个button而不是LinkButton呢!莫非他搞错了!
突然我想到列有个CommandType属性,来了灵感,一定是问题出在这里.
我修改了编辑列的属性为CommandType=PushButton,然后用思归的办法,结果证明我的IQ还是蛮不错D !
我试着打印了现在的Cells(0).Controls(0).GetType!
结果是System.Web.UI.WebControls.Button
靠!
我感慨万千,ms是很伟大,但是弄出的东西怎么感觉有点bt,设置CommandType不同会搞出两个看起来没多大关系的东东,一个System.Web.UI.WebControls.DataGridLinkButton就是private,而另一个是system.Web.UI.WebControls.Button,自然是可以访问了!
于是我试着把DataGrid中不同的列到底是什么东西都打印了一下.
EditCommandColumn System.Web.UI.WebControls.Button
BoundColumn System.Web.UI.WebControls.TextBox
ButtonColumn System.Web.UI.WebControls.DataGridLinkButton
HyperLinkColumn System.Web.UI.WebControls.HyperLink
TemplateColumn System.Web.UI.WebControls.HyperLink
这就是路上真面目!
当然最后一个模板列能打印出什么东西决定于你自己放的东西了!
到现在我明白了为什么看那个**内幕上的在DataGrid中编辑数据的时候会出现这样当初让我模不着头脑的代码:
TextBox txtItem;
TextBox txtItemKind;
intItemid=(int)dgdScoreTemplate.DataKeys[e.Item.ItemIndex];
txtItem=(TextBox)e.Item.Cells[3].Controls[0];
txtItemKind=(TextBox)e.Item.Cells[2].Controls[0];
原来那些东西骨子里就是一些Button, HyperLink, TextBox !
真实豁然开朗啊!
代码片断:
aspx
=======================================================================
<form id="Form1" method="post" runat="server">
<FONT face="宋体">
<asp:RequiredFieldValidator id="RequiredFieldValidator1" style="Z-INDEX: 102; LEFT: 200px;
POSITION: absolute; TOP: 0px"
runat="server" ErrorMessage="RequiredFieldValidator"
ControlToValidate="txtlll"></asp:RequiredFieldValidator>
<asp:Button id="Button2" style="Z-INDEX: 106; LEFT: 200px; POSITION: absolute; TOP: 512px"
runat="server"
Text="create session"></asp:Button>
<asp:Button id="Button1" style="Z-INDEX: 105; LEFT: 856px; POSITION: absolute; TOP: 504px"
runat="server"
Text="Button" CausesValidation="False"></asp:Button>
<asp:TextBox id="TextBox2" style="Z-INDEX: 104; LEFT: 680px; POSITION: absolute; TOP: 88px"
runat="server"
Height="96px" TextMode="MultiLine" MaxLength="20"></asp:TextBox>
<asp:TextBox id="TextBox1" style="Z-INDEX: 103; LEFT: 664px; POSITION: absolute; TOP: 56px"
runat="server"
Width="368px" MaxLength="15"></asp:TextBox>
<asp:TextBox ID="txtlll" Runat="server"></asp:TextBox>
<asp:datagrid id="dgdScoreshow" style="Z-INDEX: 101; LEFT: 128px; POSITION: absolute; TOP:
272px"
runat="server" Height="179px" Width="536px" AutoGenerateColumns="false">
<Columns>
<asp:EditCommandColumn EditText="edit" CancelText="cancel"
UpdateText="update" ButtonType=PushButton></asp:EditCommandColumn>
<asp:BoundColumn DataField="uid"></asp:BoundColumn>
<asp:ButtonColumn DataTextField="status"></asp:ButtonColumn>
<asp:HyperLinkColumn DataTextField="name"></asp:HyperLinkColumn>
<asp:TemplateColumn>
<ItemTemplate>
<%#DataBinder.Eval(Container.DataItem,"name")%>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:datagrid></FONT>
</form>
codebehind:
==========================================================================
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
If Not IsPostBack Then
GetData()
End If
End Sub
Private Sub GetData()
Dim cnn As New SqlConnection("data source=localhost;initial catalog=model;integrated security=sspi")
Dim cmd As New SqlCommand("select * from sysusers", cnn)
Dim adapter As New SqlDataAdapter(cmd)
Dim dst As New DataSet
Try
adapter.Fill(dst)
dgdScoreshow.DataSource = dst.Tables(0).DefaultView
dgdScoreshow.DataBind()
Catch ex As Exception
Response.Write(ex.Message)
End Try
End Sub
Private Sub dgdScoreshow_EditCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs)
Handles dgdScoreshow.EditCommand
dgdScoreshow.EditItemIndex = e.Item.ItemIndex
GetData()
Dim t As DataGridItem = dgdScoreshow.Items(e.Item.ItemIndex)
Response.Write("EditCommandColumn " + t.Cells(0).Controls(0).GetType.ToString + "<br>")
Response.Write("BoundColumn " + t.Cells(1).Controls(0).GetType.ToString + "<br>")
Response.Write("ButtonColumn" + t.Cells(2).Controls(0).GetType.ToString + "<br>")
Response.Write("HyperLinkColumn " + t.Cells(3).Controls(0).GetType.ToString + "<br>")
Response.Write("TemplateColumn " + t.Cells(3).Controls(0).GetType.ToString + "<br>")
Dim bt As Button = CType(dgdScoreshow.Items(e.Item.ItemIndex).Cells(0).Controls(0), Button)
bt.CausesValidation = False
End Sub
尾声:
当一种方法不可行时可以尝试其他方法!有了思路就应该去尝试!解决问题要抓实物的根本!