GridView编辑删除操作

GridView编辑删除操作

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

GridView编辑删除操作此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“”,获取验证码。在微信里搜索“”或者“”或者微信扫描右侧二维码都可以关注本站微信公众号。

 

  第一种:使用DataSource数据源中自带的编辑删除方法,这样的不经常使用,在这里就不加说明了。

  另外一种:使用GridView的三种事件:GridView1_RowEditing(编辑)、GridView1_RowUpdating(更新)、GridView1_RowCancelingEdit(取消编辑)。GridView1属性中将DataKeyNames的值设置为主键名,否则找不到索引,这个非常重要哦。

该方法有2种操作,一种是不正确绑定列转换为模板列,第二种是转换为模板列。

 

这里先说不转换为模板列的情况;

 

首先;先对GridView进行数据绑定,无论用代码绑定还是DataSource绑定都能够。绑定好后,对GridView加入绑定列GridView编辑删除操作 和编辑列GridView编辑删除操作 (注意这里,加入好后不做不论什么修改,千万不要将它们转换为模板列),加入好后,将所要绑定的数据库表字段填入GridView编辑删除操作 属性中。

然后,分别激活上述提到的三种事件,然后加入代码:

protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)

{ //运行删除

string str = “delete from tb_hby where id='”+GridView1.DataKeys[e.RowIndex].Value.ToString()+”‘”;

    db.Delete(str); //db是操作类的实例,Delete是删除数据的方法

this.GridView1.DataBind();

}

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)

{//运行更新

    string cell1 = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString().Trim();//第一列注意这样的写法非常重要

     string cell2 = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString().Trim();//第二列注意这样的写法非常重要

     string str = “update tb_hby set hby_title='” + cell1 + “‘,hby_Datetime='” + cell2 + “‘ where id='” + GridView1.DataKeys[e.RowIndex].Value.ToString() + “‘”;

        db.Update(str);//db是操作类的实例,Update是更新数据的方法

        GridView1.EditIndex = -1;

        GView();

}

protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)

 {//激活编辑button的事件

        this.GridView1.EditIndex = e.NewEditIndex;

        GView();

 }

protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)

    {//取消编辑状态的事件

        GridView1.EditIndex = -1;

        GView();

}

说明:此方法中,如果要求某个绑定列不做编辑,则在它的前台代码中增加ReadOnly=”true”就可以。

此方法有一些缺点,比方对日期列进行格式化时,显示的时候是格式化后的日期,可是在编辑状态下仍然显示出日期的原貌,还有,某一列的字符太长时,不好对它进行字符截取。

在点击删除button的时候,假设须要一个弹出删除提示,则要将删除列转化为模板列,其代码例如以下:

<ItemTemplate>

  <asp:LinkButton ID=”LinkButton1″ runat=”server” CausesValidation=”False” CommandName=”Delete” OnClientClick=”return confirm(‘确定要删除吗?’)”                     Text=”删除”></asp:LinkButton>

</ItemTemplate>

也能够这样写:

在RowDataBind事件中:

if (e.Row.RowType == DataControlRowType.DataRow)

        {

            LinkButton lnkdelete = (LinkButton)e.Row.FindControl(“lnkdelete”);

            lnkdelete.Attributes.Add(“onclick”,”return confirm(‘您确定要删除吗?’)”);

        }

假设不转化为模板列,这这样写:

if (e.Row.RowType == DataControlRowType.DataRow)

        {

            if (e.Row.RowState == DataControlRowState.Normal || e.Row.RowState == DataControlRowState.Alternate)

            {

                //((LinkButton)e.Row.Cells[7].Controls[0]).Attributes.Add(“onclick”, “javascript:return confirm(‘你确认要删除:\”” + e.Row.Cells[0].Text + “\”吗?’)”);

                ((LinkButton)e.Row.Cells[7].Controls[0]).Attributes.Add(“onclick”, “javascript:return confirm(‘你确认要删除吗?’)”);

            }

        }

完整代码例如以下:

<asp:GridView ID=”GridView1″ runat=”server” AutoGenerateColumns=”False” DataKeyNames=”id” OnRowDeleting=”GridView1_RowDeleting” OnRowEditing=”GridView1_RowEditing” OnRowCancelingEdit=”GridView1_RowCancelingEdit” OnRowUpdating=”GridView1_RowUpdating”>

            <Columns>

                <asp:BoundField DataField=”id” HeaderText=”id” InsertVisible=”False” ReadOnly=”True”  SortExpression=”id” />

 

                <asp:BoundField DataField=”hby_Title” HeaderText=”hby_Title”  SortExpression=”hby_Title” AccessibleHeaderText=”fgfg” />

 

                <asp:BoundField DataField=”hby_Datetime” DataFormatString=”{0:HH:mm}”  />

                <asp:CommandField ShowEditButton=”True” />

                <asp:TemplateField ShowHeader=”False”>

                    <ItemTemplate>

                        <asp:LinkButton ID=”LinkButton1″ runat=”server” CausesValidation=”False” CommandName=”Delete” OnClientClick=”return confirm(‘确定要删除吗?’)”

                            Text=”删除”></asp:LinkButton>

                    </ItemTemplate>

                </asp:TemplateField>

            </Columns>

        </asp:GridView>

 

后台代码:

public partial class Default3 : System.Web.UI.Page

{

    DBconn db = new DBconn();

    protected void Page_Load(object sender, EventArgs e)

    {

        if (!Page.IsPostBack)

        {

            GView();

        }

    }

 

    private void GView()

    {

        string strbind = “select id,hby_title,hby_Datetime from tb_hby order by id desc”;

        this.GridView1.DataSource = db.getDataSet(strbind);

        this.GridView1.DataBind();

    }

    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)

    {

        string str = “delete from tb_hby where id='”+GridView1.DataKeys[e.RowIndex].Value.ToString()+”‘”;

        db.Delete(str);

        this.GridView1.DataBind();

    }

    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)

    {

        this.GridView1.EditIndex = e.NewEditIndex;

        GView();

    }

    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)

    {

        string cell1 = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString().Trim();//第一列

        string cell2 = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString().Trim();//第二列

        string str = “update tb_hby set hby_title='” + cell1 + “‘,hby_Datetime='” + cell2 + “‘ where id='” + GridView1.DataKeys[e.RowIndex].Value.ToString() + “‘”;

        db.Update(str);//db是操作类的实例,Update是更新数据的方法

        GridView1.EditIndex = -1;

        GView();

    }

    protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)

    {

        GridView1.EditIndex = -1;

        GView();

    }

}

 

 

下面是对绑定列转换为模板列的操作(包含将编辑列和删除列都转化为模板列):

private void GView()

{//绑定数据源

   string strbind = “select top 15 id,hby_title,hhhhh,hby_Datetime from tb_hby”;

   this.GridView1.DataSource = db.getDataSet(strbind);

   this.GridView1.DataBind();

}

protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)

{//运行删除

   string str = “delete from tb_hby where id='”+GridView1.DataKeys[e.RowIndex].Value.ToString()+”‘”;

   db.Delete(str);

    //GView();

    Response.Write(“<script language=’JavaScript’>”);

    Response.Write(“alert(‘删除成功!’);location.href=’default3.aspx’;”);

    Response.Write(“</script>”);

 }

 protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)

 {//激活编辑

        this.GridView1.EditIndex = e.NewEditIndex;

        GView();

 }

 protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)

 {//运行更新

string EditTitle = ((TextBox)(GridView1.Rows[e.RowIndex].FindControl(“TextBox1”))).Text.ToString().Trim();

   string DateTimestr = ((TextBox)(GridView1.Rows[e.RowIndex].FindControl(“TextBox2”))).Text;//注意:日期字段不要加ToString(),否则会报错,而nvarchar和int的字段能够加

    string hhh = ((TextBox)(GridView1.Rows[e.RowIndex].FindControl(“TextBox3”))).Text.ToString();

   string str = “update tb_hby set hby_title='” +EditTitle + “‘,hby_Datetime='” + DateTimestr + “‘,hhhhh='”+hhh+”‘ where id='” + GridView1.DataKeys[e.RowIndex].Value.ToString() + “‘”;

   db.Update(str);

   GridView1.EditIndex = -1;

   GView();

 }

 

这里千万要注意

当对绑定列转换为模板列了之后,编辑列这样写:

string EditTitle = ((TextBox)(GridView1.Rows[e.RowIndex].FindControl(“TextBox1”))).Text.ToString().Trim();

不转化为模板列的时候,编辑列这样写:

string EditTitle = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString().Trim();

 

这里easy搞错,以致常常发生疑惑。

protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)

 {//取消编辑状态

        GridView1.EditIndex = -1;

        GView();

 }

 

下面是前台代码:

<asp:GridView ID=”GridView1″ runat=”server” AutoGenerateColumns=”False” DataKeyNames=”id” OnRowDeleting=”GridView1_RowDeleting” OnRowEditing=”GridView1_RowEditing” OnRowCancelingEdit=”GridView1_RowCancelingEdit” OnRowUpdating=”GridView1_RowUpdating”>

            <Columns>

                <asp:BoundField DataField=”id” HeaderText=”id” InsertVisible=”False” ReadOnly=”True”

                    SortExpression=”id” />

                <asp:TemplateField AccessibleHeaderText=”fgfg” HeaderText=”hby_Title” SortExpression=”hby_Title”>

                    <EditItemTemplate>

                        <asp:TextBox ID=”TextBox1″ runat=”server” Text='<%# Eval(“hby_Title”) %>’></asp:TextBox>

                    </EditItemTemplate>

                    <ItemTemplate>

                        <asp:Label ID=”Label1″ runat=”server” Text='<%# Eval(“hby_Title”) %>’></asp:Label>

                    </ItemTemplate>

                </asp:TemplateField>

                <asp:TemplateField>

                    <EditItemTemplate>

                        <asp:TextBox ID=”TextBox2″ runat=”server” Text='<%#  Eval(“hby_Datetime”, “{0:HH:mm}”) %>’></asp:TextBox>

                    </EditItemTemplate>

                    <ItemTemplate>

                        <asp:Label ID=”Label2″ runat=”server” Text='<%# Eval(“hby_Datetime”, “{0:HH:mm}”) %>’></asp:Label>

                    </ItemTemplate>

                </asp:TemplateField>

                <asp:TemplateField HeaderText=”好”>

                    <EditItemTemplate>

                        <asp:TextBox ID=”TextBox3″ runat=”server” Text='<%# Bind(“hhhhh”) %>’></asp:TextBox>

                    </EditItemTemplate>

                    <ItemTemplate>

                        <asp:Label ID=”Label3″ runat=”server” Text='<%# Bind(“hhhhh”) %>’></asp:Label>

                    </ItemTemplate>

                </asp:TemplateField>

                <asp:TemplateField ShowHeader=”False”>

                    <EditItemTemplate>

                        <asp:LinkButton ID=”LkBtnUpdate” runat=”server” CausesValidation=”True” CommandName=”Update”

                            Text=”更新”></asp:LinkButton>

                        <asp:LinkButton ID=”LkBtnCtrl” runat=”server” CausesValidation=”False” CommandName=”Cancel”

                            Text=”取消”></asp:LinkButton>

                    </EditItemTemplate>

                    <ItemTemplate>

                         <img src=”img/edt.gif” /><asp:LinkButton ID=”LinkButton2″ runat=”server” CausesValidation=”False” CommandName=”Edit”

                            Text=”编辑”></asp:LinkButton>

                    </ItemTemplate>

                </asp:TemplateField>

                <asp:TemplateField ShowHeader=”False” HeaderText=”删除”>

                    <ItemTemplate>

                       <asp:LinkButton ID=”LinkButton1″ runat=”server” CausesValidation=”False” CommandName=”Delete” OnClientClick=”return confirm(‘确定要删除吗?’)”

                            Text=”删除”></asp:LinkButton>

                    </ItemTemplate>

                </asp:TemplateField>

            </Columns>

        </asp:GridView>

 

以上绑定中,不管是Eval或者Bind都能够。

 

 

  第三种方法:将编辑和显示都放在模板列中,代码例如以下:

前台绑定:

<asp:TemplateField HeaderText=”出团日期”>

    <ItemTemplate>

      <asp:TextBox ID=”tbx_ctrq” runat=”server” Text='<%# Eval(“cspd_ctrq”) %>’ Visible=”false”></asp:TextBox>

      <asp:Label ID=”lbl_ctrq” runat=”server” Text='<%# Eval(“cspd_ctrq”) %>’></asp:Label>

   </ItemTemplate>

  <ControlStyle Width=”84px” />

</asp:TemplateField>

<asp:TemplateField HeaderText=”价格”>

   <ItemTemplate>

   <asp:TextBox ID=”tbx_price” runat=”server” Text='<%# Eval(“cspd_price”) %>’ Visible=”false”></asp:TextBox>

   <asp:Label ID=”lbl_price” runat=”server” Text='<%# Eval(“cspd_price”) %>’></asp:Label>

 </ItemTemplate>

  <ControlStyle Width=”60px” />

</asp:TemplateField>

 

<asp:TemplateField HeaderText=”编辑” ShowHeader=”False”>

  <ItemTemplate>

    <asp:LinkButton ID=”LB_edit” runat=”server” CausesValidation=”False” CommandArgument='<%# ((GridViewRow) Container).RowIndex %>’ CommandName=”iEdit” Text=”编辑”></asp:LinkButton>

   <asp:LinkButton ID=”LB_upd” runat=”server” CausesValidation=”True” CommandName=”iUpdate”

       Visible=”false” CommandArgument='<%# ((GridViewRow) Container).RowIndex %>’ Text=”更新”></asp:LinkButton>

   <asp:LinkButton ID=”LB_cancel” runat=”server” CausesValidation=”False” CommandName=”iCancel” Visible=”false” CommandArgument='<%# ((GridViewRow) Container).RowIndex %>’ Text=”取消”></asp:LinkButton>

  </ItemTemplate>

</asp:TemplateField>

<asp:TemplateField HeaderText=”删除”>

  <ItemTemplate>

   <asp:LinkButton ID=”LB_Del” runat=”server” OnClientClick=”return confirm(‘确定要删除吗?’)”

       CommandName=”Delete” Text=”删除”></asp:LinkButton>

  </ItemTemplate>

</asp:TemplateField>

 

 

后台代码例如以下:

protected void GV_Main_RowCommand(object sender, GridViewCommandEventArgs e)

    {

        if (e.CommandName == “iEdit”)

        {

            int rowIndex = Convert.ToInt32(e.CommandArgument);

            ((LinkButton)GV_Main.Rows[rowIndex].FindControl(“LB_edit”)).Visible = false;

            ((LinkButton)GV_Main.Rows[rowIndex].FindControl(“LB_upd”)).Visible = true;

            ((LinkButton)GV_Main.Rows[rowIndex].FindControl(“LB_cancel”)).Visible = true;

 

            ((Label)GV_Main.Rows[rowIndex].FindControl(“lbl_chanpin”)).Visible = false;

            ((TextBox)GV_Main.Rows[rowIndex].FindControl(“tbx_chanpin”)).Visible = true;

 

            ((Label)GV_Main.Rows[rowIndex].FindControl(“lbl_ctrq”)).Visible = false;

            ((TextBox)GV_Main.Rows[rowIndex].FindControl(“tbx_ctrq”)).Visible = true;

        }

        if (e.CommandName == “iCancel”)

        {

            int rowIndex = Convert.ToInt32(e.CommandArgument);

            ((LinkButton)GV_Main.Rows[rowIndex].FindControl(“LB_edit”)).Visible = true;

            ((LinkButton)GV_Main.Rows[rowIndex].FindControl(“LB_upd”)).Visible = false;

            ((LinkButton)GV_Main.Rows[rowIndex].FindControl(“LB_cancel”)).Visible = false;

 

            ((Label)GV_Main.Rows[rowIndex].FindControl(“lbl_chanpin”)).Visible = true;

            ((TextBox)GV_Main.Rows[rowIndex].FindControl(“tbx_chanpin”)).Visible = false;

 

            ((Label)GV_Main.Rows[rowIndex].FindControl(“lbl_ctrq”)).Visible = true;

            ((TextBox)GV_Main.Rows[rowIndex].FindControl(“tbx_ctrq”)).Visible = false;

        }

        if (e.CommandName == “iUpdate”)

        {

            int rowIndex = Convert.ToInt32(e.CommandArgument);

            if (!wpf.IsNum(((TextBox)GV_Main.Rows[rowIndex].FindControl(“tbx_price”)).Text.Trim()))

            {

                Page.ClientScript.RegisterStartupScript(this.GetType(), “Startup”, “<script>alert(‘价格必须是数字!’);</script>”);

            }

             string strupd = “UPDATE [tb_cspd] SET [cspd_chanpin] = ‘” + wpf.checkStr(((TextBox)GV_Main.Rows[rowIndex].FindControl(“tbx_chanpin”)).Text.Trim()) + “‘, [cspd_ctrq] = ‘” + wpf.checkStr(((TextBox)GV_Main.Rows[rowIndex].FindControl(“tbx_ctrq”)).Text.Trim()) + “‘, WHERE [id] = ” + GV_Main.DataKeys[rowIndex][0].ToString();

 

                //Response.Write(strupd);

                wpf.SqlQuery(strupd);

                GV_Main.DataBind();

            }

        }

}

 

 

 

点击编辑button后统一列在文本框中进行编辑:

效果:

GridView编辑删除操作

首先还是在GridView1属性中DataKeyNames的值设置为主键名

前台代码:

<asp:GridView ID=”GridView3″ runat=”server” AutoGenerateColumns=”False” OnRowCommand=”GridView3_RowCommand” DataKeyNames=”News_Id”>

                        <Columns>

                            <asp:BoundField DataField=”News_Title” HeaderText=”标题” />

                            <asp:BoundField DataField=”News_Source” HeaderText=”来源” />

                            <asp:BoundField DataField=”News_Date” HeaderText=”日期” />

                            <asp:TemplateField HeaderText=”编辑”>

                                <ItemTemplate>

                                    <asp:LinkButton ID=”LkBtnbianji” runat=”server” CommandName=”edit_ok” CommandArgument='<%# ((GridViewRow) Container).RowIndex  %>’>编辑</asp:LinkButton>

                                </ItemTemplate>

                            </asp:TemplateField>

                        </Columns>

                    </asp:GridView>

 

后台代码:

private void GView3()

    {

        string strbind = “select News_Id,News_Title,News_Source,News_Date from tb_News”;

        this.GridView3.DataSource = db.getDataSet(strbind);

        this.GridView3.DataBind();

    }

    protected void GridView3_RowCommand(object sender, GridViewCommandEventArgs e)

    {

        if (e.CommandName == “edit_ok”)

        {

            int rowIndex = Convert.ToInt32(e.CommandArgument);

            string strbind = “select News_Id,News_Title,News_Source,News_Date from tb_News where News_Id=” + GridView3.DataKeys[rowIndex][0].ToString();

            DataRow dr = db.getDataSet(strbind).Tables[0].Rows[0];

            this.BunAdd.CommandArgument = GridView3.DataKeys[rowIndex][0].ToString();

            this.TextTitle.Text = dr[“News_Title”].ToString();

            this.TextType.Text=dr[“News_Source”].ToString();

            this.TextDatetime.Text = dr[“News_Date”].ToString();

        }

    }

    protected void BunAdd_Click(object sender, EventArgs e)

    {

        string up = “update tb_News set News_Title='” + this.TextTitle.Text.Trim() + “‘,News_Source='” + this.TextType.Text.Trim() + “‘,News_Date='” + this.TextDatetime.Text.Trim() + “‘ where News_Id=”+BunAdd.CommandArgument;

        db.Update(up);

        GView3();

    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117985.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • c语言中char转换成string_字符数字转为int型

    c语言中char转换成string_字符数字转为int型1,char型数字转换为int型chara[]=”32″;printf(“%d\n”,a[0]-‘0’);//输出结果为32,int转化为char***********************************linuxc*********************************** (1)字符串转换成数字,用atoi,atol,

  • 柯西—施瓦茨不等式的证明_柯西不等式3种变形

    柯西—施瓦茨不等式的证明_柯西不等式3种变形柯西-施瓦茨不等式是一个在众多背景下都有应用的不等式,例如线性代数,数学分析,概率论,向量代数以及其他许多领域。它被认为是数学中最重要的不等式之一。此不等式最初于1821年被柯西提出,其积分形式在18

  • 数仓建模—数据安全「建议收藏」

    数仓建模—数据安全「建议收藏」数据安全差分隐私差分隐私是用来防范差分攻击的,差分隐私(英语:differentialprivacy)是密码学中的一种手段,旨在提供一种当从统计数据库查询时,最大化数据查询的准确性,同时最大限度减少识别其记录的机会比如有一群人出去聚餐,那么其中某人是否是单身狗就属于差分隐私。为了更形式化地描述差分隐私,我们需要先定义相邻数据集。现给定两个数据集D和D’,若它们有且仅有一条数据不一样,那我们就称此二者为相邻数据集。那么对于一个随机化算法(所谓随机化算法,是指对特定输入,该算法的输出不是固定值,而是服

  • java finalize方法_实例分割模型

    java finalize方法_实例分割模型作者源代码已经开源,因此更新了结合作者源代码分析的网络实现部分此外,SOLOv2论文已经发布https://arxiv.org/abs/2003.10152,

  • 网络入门及制作双绞线实验结论_计算机网络双绞线包括哪几种类型

    网络入门及制作双绞线实验结论_计算机网络双绞线包括哪几种类型专业软件工程姓名小何学长实验目的:1. 掌握RJ-45双绞线的直通线和交叉线的制作方法,了解其应用场合。2. 利用测线仪测试网线是否正常。实验原理:1. 双绞线简介双绞线是最常用的网络传输媒体,其型号10BBASE-T、100BASE-T是指10Mbps、100Mbps以基带传输方式工作的双绞线。按信号线外面有无屏蔽保护层分为:屏蔽双绞线——STP,有金属网丝套作为屏蔽层,无分类;无屏蔽双绞线——UTP,没有屏蔽层,有多个分类,如UTP-3,UTP-5,UTP-5+多…

    2022年10月28日
  • matlab中误差计算公式_mse均方误差计算公式

    matlab中误差计算公式_mse均方误差计算公式残差平方和(SSE)计算公式:代码实现:sse=sum((YReal-YPred).^2);均方误差(MSE)计算公式:代码实现:mse=sqrt(sum((YReal-YPred).^2))./2;平均绝对误差(MAE)计算公式:代码实现:mae=mean(abs(YReal-YPred));平均绝对百分比误差(MAPE)计算公式:代码实现mape=mean(abs((YReal-YPred)./YReal));均方根误差(R

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号