DataGrid中的causevalidation问题-----浅析DataGrid中的列

故事背景:
        现在的项目中有块需要做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

尾声:
     当一种方法不可行时可以尝试其他方法!有了思路就应该去尝试!解决问题要抓实物的根本!

posted @ 2005-04-16 13:34  zhanqiangz(闲云野鹤)  阅读(1666)  评论(0编辑  收藏  举报