none
GridView控件里实现编辑,如何控制其不能编辑为空~~不采用编辑模版的验证控件,有没有什么办法?? RRS feed

  • 问题

  • 如果我想在 GridView控件里实现编辑,这个功能是通过控件来实现的~~
    但是 数据表里比如说 有个 用户密码列的属性数不允许为空,当通过 GridView的编辑按钮把该 用户密码设置为空时将会出现异常,我该怎么控制这个问题呢??比如说当编辑的该项为空时,弹出一个提示对话框 等~~该怎么实现呢??


    附加说明:不知道什么原因,我的编辑模版好像被我设定了什么东西,反正现在想在编辑模版里实现的话,根本就没有办法把某个控件绑定到我的某一列上~~
    出了在编辑模版里加验证控件外还有没有什么其他的办法~~我希望在编辑的某列为空的时候给出一个提示对话框.该怎么实现啊~~~



    请各位高手指点啊~~~


    2009年8月13日 11:17

答案

  •     <Columns>
          <asp:BoundField DataField="ShipperID" HeaderText="ShipperID" InsertVisible="False"
            ReadOnly="True" SortExpression="ShipperID" />
          <asp:TemplateField>
          <ItemTemplate>
          <%#Eval("CompanyName")%>
          </ItemTemplate>
          <EditItemTemplate>
          <asp:TextBox ID="ComName" runat="server" onblur="if(this.value==''){alert('不能为空');this.focus()}" Text='<%#Eval("CompanyName")%>'></asp:TextBox>
          </EditItemTemplate>
          </asp:TemplateField>
        </Columns>
    【孟子E章】
    2009年8月14日 5:01
    版主
  • protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        // 可以在 RowUpdating 事件中写
    
        // esCharge_VoucherFinanceCode 表
        // Code nvarchar 主键
        // Name nvarchar not null
        // ServiceType  int not null
    
        // 判断 Name 和 ServiceType 是否为空
        if (e.NewValues["Name"] == null ||
            e.NewValues["Name"].ToString().Trim() == "")
        {
            this.ClientScript.RegisterClientScriptBlock(this.GetType(), "msg2", "alert('Name 不能为空');", true);
            e.Cancel = true;
            return;
        }
    
        if (e.NewValues["ServiceType"] == null ||
            e.NewValues["ServiceType"].ToString() == "")
        {
            this.ClientScript.RegisterClientScriptBlock(this.GetType(), "msg3", "alert('ServiceType 不能为空');", true);
            e.Cancel = true;
            return;
        }
    }

    知识改变命运,奋斗成就人生!
    2009年8月14日 5:09
    版主
  • ReadOnly="true",表示该列不能被编辑

    页面设计:

    <table style="border:solid 1px green;width:40%">
                <tr>
                    <td style="background-color:Green"><strong><span style="font-size: 14pt; color: #ffffff">验证GridView控件中编辑列的值</span></strong>
                    </td>
                </tr>
                <tr>
                    <td>
                        <asp:GridView Width="100%" ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None" OnRowCancelingEdit="GridView1_RowCancelingEdit" OnRowDataBound="GridView1_RowDataBound" OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating" DataKeyNames="ProductID">
                            <Columns>
                               <asp:BoundField DataField="ProductName" ReadOnly="True" HeaderText="商品名称"/>
                                <asp:TemplateField>
                                    <HeaderTemplate>
                                        <table width="100%">
                                            <tr>
                                                <td align="left" width="60%" >数量</td>
                                            </tr>
                                        </table>
                                    </HeaderTemplate>
                                    <ItemTemplate>
                                        <table width="100%">
                                            <tr>
                                                <td width="20%"><%# Eval("UnitsInStock")%></td>
                                            </tr>
                                        </table>
                                    </ItemTemplate>
                                    <EditItemTemplate>
                                        <table>
                                            <tr>
                                                <td width="20%"><asp:TextBox runat="Server" ID="t1" Text='<%# Eval("UnitsInStock")%>' Width="90%"></asp:TextBox></td>
                                            </tr>
                                        </table>
                                    </EditItemTemplate>
                                </asp:TemplateField>
                                <asp:CommandField ShowEditButton="True" HeaderText="操作" />
                            </Columns>
                            <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                            <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                            <EditRowStyle BackColor="#999999" />
                            <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                            <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                            <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                        </asp:GridView>
                    </td>
                </tr>
            </table> 

    后台代码:

    “编辑”事件处理代码:

    protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            this.GridView1.EditIndex = -1;           //        获取编辑行的索引值
            band();        // 会绑数据
        }

    当用户进入编辑状态,在文本框中输入内容后,“更新”,会触发 RowDataBound事件进行校验用户输入的数据,代码如下:

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if ((e.Row.RowState & DataControlRowState.Edit)==DataControlRowState.Edit)
            {
                RequiredFieldValidator re = new RequiredFieldValidator();   // 创建一个非空验证控件
                re.ControlToValidate = "t1";
                re.ErrorMessage = "销售量不能为空";
                re.Display = ValidatorDisplay.Dynamic;
                re.Text = "*";
                e.Row.Cells[1].Controls.Add(re);              //           将该空间添加到GridView控件中
                RangeValidator ra = new RangeValidator();
                ra.ControlToValidate = "t1";
                ra.Type = ValidationDataType.Integer;
                ra.Display = ValidatorDisplay.Dynamic;
                ra.MaximumValue = "200";
                ra.MinimumValue = "10";
                ra.Text = "*";
                ra.ErrorMessage = "销售量的范围为10-200";
                e.Row.Cells[1].Controls.Add(ra);
                ValidationSummary va = new ValidationSummary();        //    创建一个范围验证控件
                va.ShowSummary = false;
                va.ShowMessageBox = true;
                e.Row.Cells[1].Controls.Add(va);               //    添加到GridView中
            }
        }

    验证无误后,触发 RowUpdating 事件,代码如下:

    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["val"].ConnectionString);
            con.Open();
            string aa = this.GridView1.DataKeys[e.RowIndex].Value.ToString();
            string bb = ((TextBox)this.GridView1.Rows[e.RowIndex].Cells[0].FindControl("t1")).Text.ToString();
            string cc = "update products set UnitsInStock='" + bb + "' where ProductID='" + aa +"'";
            SqlCommand cmd = new SqlCommand(cc, con);
            cmd.ExecuteNonQuery();
            con.Close();
            this.GridView1.EditIndex = -1;
            band();
            Response.Write("<script>alert('更新成功!')</script>");
        }

    2009年8月13日 9:46
  •     protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) //更新按钮
        {
            GridViewRow row = GridView1.Rows[e.RowIndex];
            TextBox box = (TextBox)row.Cells[2].Controls[0];

            if (box密码不符合规则)
            {
                GridView1.EditIndex = -1;
                ClientScript.RegisterStartupScript(Page.GetType, "Key", "输出脚本");
            }
        }
    jon.valett@gmail.com
    2009年8月13日 9:56
    版主
  • 在编辑模式下使用验证空件RequiredFieldValidator


    努力+方法=成功
    2009年8月13日 10:27
  • 当某一控件失去焦点时触发。在这里指当textbox失去焦点时验证它的value是否为空。


    Microsoft Online Community Support
    2009年8月14日 5:31
  • 这些是dhtml,js的东西。做web开发,css,html,js是最基本的东西。
    另外,既然学习asp.net,就应当充分利用asp.net提供的便利方法。
    实际上,采用模板列,然后在RowUpdating事件里使用FindControl是比较简单直观的方法。
    【孟子E章】
    2009年8月14日 5:36
    版主
  • Trim 方法是去掉空格
    知识改变命运,奋斗成就人生!
    2009年8月14日 5:55
    版主
  • 运行成功~~谢过~~还有几个问题想请教下:e.NewValues["Name"] == null 和  e.NewValues["Name"].ToString().Trim() == "" 两个判断语句有什么区别吗?、 Trim()  是用来干什么的?我在其他的时候也遇到过~~















    去除开头和结尾的空格,其中还有几个重载版本,去除指定字符!

    jon.valett@gmail.com
    2009年8月14日 5:57
    版主

全部回复

  • ReadOnly="true",表示该列不能被编辑

    页面设计:

    <table style="border:solid 1px green;width:40%">
                <tr>
                    <td style="background-color:Green"><strong><span style="font-size: 14pt; color: #ffffff">验证GridView控件中编辑列的值</span></strong>
                    </td>
                </tr>
                <tr>
                    <td>
                        <asp:GridView Width="100%" ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None" OnRowCancelingEdit="GridView1_RowCancelingEdit" OnRowDataBound="GridView1_RowDataBound" OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating" DataKeyNames="ProductID">
                            <Columns>
                               <asp:BoundField DataField="ProductName" ReadOnly="True" HeaderText="商品名称"/>
                                <asp:TemplateField>
                                    <HeaderTemplate>
                                        <table width="100%">
                                            <tr>
                                                <td align="left" width="60%" >数量</td>
                                            </tr>
                                        </table>
                                    </HeaderTemplate>
                                    <ItemTemplate>
                                        <table width="100%">
                                            <tr>
                                                <td width="20%"><%# Eval("UnitsInStock")%></td>
                                            </tr>
                                        </table>
                                    </ItemTemplate>
                                    <EditItemTemplate>
                                        <table>
                                            <tr>
                                                <td width="20%"><asp:TextBox runat="Server" ID="t1" Text='<%# Eval("UnitsInStock")%>' Width="90%"></asp:TextBox></td>
                                            </tr>
                                        </table>
                                    </EditItemTemplate>
                                </asp:TemplateField>
                                <asp:CommandField ShowEditButton="True" HeaderText="操作" />
                            </Columns>
                            <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                            <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                            <EditRowStyle BackColor="#999999" />
                            <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                            <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                            <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                        </asp:GridView>
                    </td>
                </tr>
            </table> 

    后台代码:

    “编辑”事件处理代码:

    protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            this.GridView1.EditIndex = -1;           //        获取编辑行的索引值
            band();        // 会绑数据
        }

    当用户进入编辑状态,在文本框中输入内容后,“更新”,会触发 RowDataBound事件进行校验用户输入的数据,代码如下:

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if ((e.Row.RowState & DataControlRowState.Edit)==DataControlRowState.Edit)
            {
                RequiredFieldValidator re = new RequiredFieldValidator();   // 创建一个非空验证控件
                re.ControlToValidate = "t1";
                re.ErrorMessage = "销售量不能为空";
                re.Display = ValidatorDisplay.Dynamic;
                re.Text = "*";
                e.Row.Cells[1].Controls.Add(re);              //           将该空间添加到GridView控件中
                RangeValidator ra = new RangeValidator();
                ra.ControlToValidate = "t1";
                ra.Type = ValidationDataType.Integer;
                ra.Display = ValidatorDisplay.Dynamic;
                ra.MaximumValue = "200";
                ra.MinimumValue = "10";
                ra.Text = "*";
                ra.ErrorMessage = "销售量的范围为10-200";
                e.Row.Cells[1].Controls.Add(ra);
                ValidationSummary va = new ValidationSummary();        //    创建一个范围验证控件
                va.ShowSummary = false;
                va.ShowMessageBox = true;
                e.Row.Cells[1].Controls.Add(va);               //    添加到GridView中
            }
        }

    验证无误后,触发 RowUpdating 事件,代码如下:

    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["val"].ConnectionString);
            con.Open();
            string aa = this.GridView1.DataKeys[e.RowIndex].Value.ToString();
            string bb = ((TextBox)this.GridView1.Rows[e.RowIndex].Cells[0].FindControl("t1")).Text.ToString();
            string cc = "update products set UnitsInStock='" + bb + "' where ProductID='" + aa +"'";
            SqlCommand cmd = new SqlCommand(cc, con);
            cmd.ExecuteNonQuery();
            con.Close();
            this.GridView1.EditIndex = -1;
            band();
            Response.Write("<script>alert('更新成功!')</script>");
        }

    2009年8月13日 9:46
  •     protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) //更新按钮
        {
            GridViewRow row = GridView1.Rows[e.RowIndex];
            TextBox box = (TextBox)row.Cells[2].Controls[0];

            if (box密码不符合规则)
            {
                GridView1.EditIndex = -1;
                ClientScript.RegisterStartupScript(Page.GetType, "Key", "输出脚本");
            }
        }
    jon.valett@gmail.com
    2009年8月13日 9:56
    版主
  • 我晕 测试了 合理~~~~~

    • 已编辑 mldark 2009年8月13日 10:22
    2009年8月13日 9:59
  • 看不懂,能不能简单点,太多代码,把我看的更晕了~~
    谢了~~新手,还请多包涵~~~
    讲的简单点,或是讲下重点~~~
    适当的写点代码~~
    谢谢~~

    2009年8月13日 9:59
  • 该怎么解决啊?能不能说的清楚点~~谢啦~~~
    2009年8月13日 10:01
  • 在编辑模式下使用验证空件RequiredFieldValidator


    努力+方法=成功
    2009年8月13日 10:27
  • 在编辑模式下使用验证空件RequiredFieldValidator
    努力+方法=成功
    2009年8月13日 10:27
  • 在编辑模式下使用验证空件RequiredFieldValidator
    努力+方法=成功

    他用的是自动生成文本框 没那么容易增加
    2009年8月13日 10:29
  • w我的编译模版不知道是什么原因,现在没有办法把某个 控件绑定到 我需要的列上~~
    必须在编辑模版里用验证控件吗?有没有其他的办法啊??
    谢谢啦~~
    有哪位高手知道的话请指点下吧~~~
    2009年8月13日 11:12
  •  在输入框控件里加入
    onblur="if(this.value==''){ this.focus()}"
    【孟子E章】
    2009年8月14日 2:00
    版主
  •  在输入框控件里加入
    onblur="if(this.value==''){ this.focus()}"
    【孟子E章】



    关键是:我根本找不到输入控件啊??
    我是在 GridView控件里实现的编辑,我控制不了代码啊?、



    我再重述下我的问题吧:
    GridView控件里实现了编辑功能,但是我的对应的数据库表格要去某列非空,如果我在gridview里编辑其为空的时候将会出现异常,该怎么控制,使编辑不能为空呢??

    不用编辑模版的验证控件的话就没有办法实现了吗??

    2009年8月14日 2:15
  • 你好,用验证控件是最省事的办法。如果如老孟的那样用脚本,如果用户根本不点击那个textbox,onblur方法就不触发了。
    所以用验证控件我觉得是比较好的。
    Microsoft Online Community Support
    2009年8月14日 3:33
  •     <Columns>
          <asp:BoundField DataField="ShipperID" HeaderText="ShipperID" InsertVisible="False"
            ReadOnly="True" SortExpression="ShipperID" />
          <asp:TemplateField>
          <ItemTemplate>
          <%#Eval("CompanyName")%>
          </ItemTemplate>
          <EditItemTemplate>
          <asp:TextBox ID="ComName" runat="server" onblur="if(this.value==''){alert('不能为空');this.focus()}" Text='<%#Eval("CompanyName")%>'></asp:TextBox>
          </EditItemTemplate>
          </asp:TemplateField>
        </Columns>
    【孟子E章】
    2009年8月14日 5:01
    版主
  • protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        // 可以在 RowUpdating 事件中写
    
        // esCharge_VoucherFinanceCode 表
        // Code nvarchar 主键
        // Name nvarchar not null
        // ServiceType  int not null
    
        // 判断 Name 和 ServiceType 是否为空
        if (e.NewValues["Name"] == null ||
            e.NewValues["Name"].ToString().Trim() == "")
        {
            this.ClientScript.RegisterClientScriptBlock(this.GetType(), "msg2", "alert('Name 不能为空');", true);
            e.Cancel = true;
            return;
        }
    
        if (e.NewValues["ServiceType"] == null ||
            e.NewValues["ServiceType"].ToString() == "")
        {
            this.ClientScript.RegisterClientScriptBlock(this.GetType(), "msg3", "alert('ServiceType 不能为空');", true);
            e.Cancel = true;
            return;
        }
    }

    知识改变命运,奋斗成就人生!
    2009年8月14日 5:09
    版主
  • 运行成功了~~谢过~~
    只是不懂 onblur="if(this.value==''){alert('不能为空');this.focus()}"是怎么来实现的啊?
    我知道alert('不能为空'); 使用来显示对话框的,但是onblur 是什么东东啊?this.focus() 又是 起到什么作用的呢?、
    新手,还请多指点啊 ~~~


    谢谢~~

    2009年8月14日 5:28
  • 当某一控件失去焦点时触发。在这里指当textbox失去焦点时验证它的value是否为空。


    Microsoft Online Community Support
    2009年8月14日 5:31
  • 这些是dhtml,js的东西。做web开发,css,html,js是最基本的东西。
    另外,既然学习asp.net,就应当充分利用asp.net提供的便利方法。
    实际上,采用模板列,然后在RowUpdating事件里使用FindControl是比较简单直观的方法。
    【孟子E章】
    2009年8月14日 5:36
    版主
  •     <Columns>
          <asp:BoundField DataField="ShipperID" HeaderText="ShipperID" InsertVisible="False"
            ReadOnly="True" SortExpression="ShipperID" />
          <asp:TemplateField>
          <ItemTemplate>
          <%#Eval("CompanyName")%>
          </ItemTemplate>
          <EditItemTemplate>
          <asp:TextBox ID="ComName" runat="server" onblur="if(this.value==''){alert('不能为空');this.focus()}" Text='<%#Eval("CompanyName")%>'></asp:TextBox>
          </EditItemTemplate>
          </asp:TemplateField>
        </Columns>
    【孟子E章】

    运行成功了,但是存在的问题是:如果我编辑的过程中输入为空时,会弹出提示对话框:不能为空;如果这个时候我想取消操作,我不编辑了,问题就出现了。我取消不了~~比须在 空的编辑框中输入 字符才可以进行取消操作,这个问题该怎么解决呢??
    高手指点啊~~*(GridView的编辑按钮之后会出现编辑界面,其中包涵 更新和取消两个按钮)










    2009年8月14日 5:37
  • 运行成功~~谢过~~还有几个问题想请教下:e.NewValues["Name"] == null 和  e.NewValues["Name"].ToString().Trim() == "" 两个判断语句有什么区别吗?、 Trim()  是用来干什么的?我在其他的时候也遇到过~~















    2009年8月14日 5:51
  • Trim 方法是去掉空格
    知识改变命运,奋斗成就人生!
    2009年8月14日 5:55
    版主
  • 运行成功~~谢过~~还有几个问题想请教下:e.NewValues["Name"] == null 和  e.NewValues["Name"].ToString().Trim() == "" 两个判断语句有什么区别吗?、 Trim()  是用来干什么的?我在其他的时候也遇到过~~















    去除开头和结尾的空格,其中还有几个重载版本,去除指定字符!

    jon.valett@gmail.com
    2009年8月14日 5:57
    版主