none
SQL中非空列在GridView中把visible属性设置为false后 , 更新失败 RRS feed

  • 问题

  •     由于GridView显示的列太多,我设置了一个ButtonList控件,用以显示某些列可以隐藏或显示。这个控件本身没有问题,但是一旦我点击Button_Update(批量更新),就会出现如图1所示错误看错误提示,是因为某些非空列(例如:ReceivableID)被我把visible 属性设置为 false了(实际上这个ReceivableID在数据库中是有数据的),不知道这种情况要怎么处理!而且我设置的ButtonList控件,可以让GridView控件每次显示不同的列,这种情况处理起来会比较复杂

    using System;

    using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; public partial class Default2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) {   GridViewList(); } protected void Button1_Click(object sender, EventArgs e) { for (int i = 0; i < GridView1.Rows.Count; i++) { GridViewRow row = GridView1.Rows[i]; SqlDataSource1.UpdateParameters[0].DefaultValue = ((TextBox)row.Cells[0].FindControl("txtName")).Text; SqlDataSource1.UpdateParameters[1].DefaultValue = ((TextBox)row.Cells[1].FindControl("txtSex")).Text; SqlDataSource1.UpdateParameters[2].DefaultValue = ((TextBox)row.Cells[1].FindControl("txtState")).Text; SqlDataSource1.UpdateParameters[3].DefaultValue = ((TextBox)row.Cells[1].FindControl("txtPhone")).Text; SqlDataSource1.UpdateParameters[4].DefaultValue = ((TextBox)row.Cells[1].FindControl("txtAddress")).Text; SqlDataSource1.UpdateParameters[5].DefaultValue = GridView1.DataKeys[i].Value.ToString(); SqlDataSource1.Update(); } }

    protected void Button_List_Click(object sender, EventArgs e)
        {
            GridViewList();

        }

    protected void GridViewList()

        {
            for (int i = 0; i < CheckBoxList_All.Items.Count; i++)
            {
                if (CheckBoxList_All.Items[i].Selected == true)
                {
                    //mdTypeOfPayment += CheckBoxList_All.Items[i].Value;
                    GridView_Search.Columns[i].Visible = true;
                }
                else
                { GridView_Search.Columns[i].Visible = false; }
            }
        }

    }



    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年4月20日 1:34

答案

  • 1)在aspx的GridView的DataKeyNames中设置(加入你不希望显示的字段名称,在主键旁边)。

    <asp:GridView …… DataKeyNames="主键,某个要隐藏的键"

    2)

    protected void Button1_Click(object sender,
    EventArgs e)
    {
       for(int i = 0;i < GridView1.Rows.Count; i++)
        {
          GridViewRow row = GridView1.Rows[i];
          …………………………
    
        SqlDataSource1.UpdateParameters[索引].DefaultValue =
    GridView1.DataKeys[i].Values[1].ToString();
    
        ………………
        }
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月20日 9:15

全部回复

  • 如果你不想把字段在GridView上显示出来,但是你又想使用,那么唯一的办法就是你在DataKeyNames中进行设置,这样就可以使用了。

    MSDN上说:Visible 属性设置为 false,则在 GridView 控件中将不显示该列,该列中的数据也不会往返于客户端。 DataKeyNames 属性添加相应的字段名称。

    【使用】

    string id =GridView1.DataKeys[行索引].Values[列索引].ToString(); 

    http://social.msdn.microsoft.com/Forums/zh-CN/295/thread/a71977eb-3865-4dc1-a970-83c61ce8d7b4/#38d31f5b-b039-4f88-9b05-93ab0e168248(这个帖子我回答如果没有问题的话,请把我最后一个回复也标记为答案吧,谢谢!)


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月20日 2:01
  •     标记为答案了!

    您给出的代码  我还没有接触过,同一行代码既有行索引又有列索引。

        您能否就我一楼给出的代码,做详细的补充呢?我实在不知道这行该写在哪里!该怎么写!

    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!


    2012年4月20日 9:12
  • 1)在aspx的GridView的DataKeyNames中设置(加入你不希望显示的字段名称,在主键旁边)。

    <asp:GridView …… DataKeyNames="主键,某个要隐藏的键"

    2)

    protected void Button1_Click(object sender,
    EventArgs e)
    {
       for(int i = 0;i < GridView1.Rows.Count; i++)
        {
          GridViewRow row = GridView1.Rows[i];
          …………………………
    
        SqlDataSource1.UpdateParameters[索引].DefaultValue =
    GridView1.DataKeys[i].Values[1].ToString();
    
        ………………
        }
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月20日 9:15
  •         谢谢您的解答! 我尝试着去做,但是出错!
            下面是我做的步骤:
            第一步.按照 : aspx的GridView的DataKeyNames中设置(加入你不希望显示的字段名称,在主键旁边)。
    <asp:GridView …… DataKeyNames="主键,某个要隐藏的键"

            我修改了自己的DataKeyNames,由原来的DataKeyNames="PRID"变成DataKeyNames="PRID,ReceivableID,PropertyIDR",这里我产生了疑问。
            第1个问题:UpdateCommand中的语句是否要做相应修改,比如把WHERE [PRID] = @PRID"相应改成WHERE [PRID] = @PRID"and ReceivableID=@ReceivableID and PropertyIDR =@PropertyIDR。
            第2个问题:以前的 <UpdateParameters>
                                <asp:Parameter Name="ReceivableID" Type="Int32" />
                                <asp:Parameter Name="PropertyIDR" Type="Int32" />
                          。。。。。。。。。。。
                                <asp:Parameter Name="BelongToCompanyR" Type="String" />
                                <asp:Parameter Name="PRID" Type="Int32" />
    是否要改成
    <UpdateParameters>
         <asp:Parameter Name="BelongToCompanyR" Type="String" />
                                <asp:Parameter Name="PRID" Type="Int32" />
                                <asp:Parameter Name="ReceivableID" Type="Int32" />
                                <asp:Parameter Name="PropertyIDR" Type="Int32" />
    再把后台的SqlDataSource_Search.UpdateParameters[索引]做相应的顺序调整?


    第二步。
        修改SqlDataSource1.UpdateParameters[索引].DefaultValue =
    GridView1.DataKeys[i].Values[1].ToString();
    下图是我按照您的提示所做的修改,但是报错

    -----------------------图1-------------------------


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年4月23日 2:55
  • 注意是“Values”,不过你截图却反映是Value……

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月23日 3:13
  • 谢谢您的提示!问题解决了!

    我还想确认一下,看看是否我漏了什么。

    修改的步骤:

    1.DataKeyNames中加入要隐藏的列,主键的位置还是放在第一个。

    2.UpdateCommand不用修改,但是<UpdateParameters>必须修改,把要隐藏的列放到最后,也就是放到<asp:Parameter Name="PRID" Type="Int32" />(这个PRID是主键)后面

    3.后台的UpdateParameters[]的顺序由于前台DataKeyNames做了修改,也要做相应的修改。


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年4月23日 3:46
  • 是的,欢迎及时反馈其它信息!^_^

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年4月23日 4:56
  • 谢谢您的解答!程序运行无误了!

    另外想请您看看这个帖子,    我现在还没有头绪http://social.msdn.microsoft.com/Forums/zh-CN/295/thread/56c9f759-51ef-4b46-baea-7b5193643706


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年4月23日 5:28