我就2个字段一个ID,一个NAME,都绑定好了.protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindGridView();
        }
    }    private void BindGridView()
    {
        SqlConnection cn = new SqlConnection(@"server=localhost;uid=sa;pwd=;database=test");
        SqlCommand cmd = new SqlCommand("select * from bbb", cn);
        cn.Open();
        GridView1.DataSource = cmd.ExecuteReader();
        GridView1.DataKeyNames = new string[] { "id" };
        GridView1.DataBind();
        cn.Close();
    }
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            e.Row.Attributes.Add("onmouseover", "javascript:DG_changeBackColor(this, true);");
            e.Row.Attributes.Add("onmouseout", "javascript:DG_changeBackColor(this,false);");            e.Row.Attributes.Add("onClick", "javascript:__doPostBack('" + GridView1.ID + "','Select$" + e.Row.RowIndex + "');");
        }
    }
    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        lblid.Text=(这里请高手补全,选中行后获取被选中行的主键);
    }

解决方案 »

  1.   

     GridViewRow row = GridView1.SelectedRow;
            lblid.Value = row.Cells[1].Text;//Cells[填你主键的位置]
      

  2.   

     GridViewRow row = GridView1.SelectedRow;
           lblid.Value = row.Cells[1].Text;
      

  3.   

    我補充下,上面的代碼我把GRIDVIEW的行伪装了一个CLICK事件,但是
    当点不同的行的时候,想获取该行的主键就获取不到了。
      

  4.   

    为什么不用SelectedIndexChanging事件而是SelectedIndexChanged事件?
      

  5.   


    老师
    SelectedIndexChanging好象是选中前触发的吧?我的意思是想选中行后,再变化下面的LABLE。TEXT属性
    所以我用了SelectedIndexChanged...
    具体还请指教
      

  6.   

    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            GridViewRow row = GridView1.SelectedRow;
            lblid.Value = row.Cells[0].Text;
        }
    我的方法试没试呀,这个应该可以的
      

  7.   


    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {
      int index1;
      for (int i = 0; i < GridView1.Rows.Count; i++)
      {
         if (GridView1.Rows[i].RowType == DataControlRowType.DataRow)
         {
            index1 = GridView1.Rows[i].RowIndex;
            lblid.Text = GridView1.DataKeys[index1]["sid"].ToString();//此处sid是你绑定表的主键字段
         }
      }
    }
      

  8.   


    lblid 没有VALUE 来显示TEXT吧.
      

  9.   

     GridView g = (GridView)sender;
           lblID.Text = g.DataKeys[e.NewSelectedIndex].Value.ToString();
      

  10.   

        protected void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
        {
            GridView g = (GridView)sender;
            Response.Write(g.DataKeys[e.NewSelectedIndex].Value.ToString());
        }我事件换成SelectedIndexChanging还是打印不出来,网页左下角一直提示网页有错误.
      

  11.   

    “lblid 没有VALUE 来显示TEXT吧”. 我是抄你的。没有就换个Text属性呗,怎么就不会变通能,还学编程呢下面的是肯定能出来的,我做项目就用这个,没问题
    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            GridViewRow row = GridView1.SelectedRow;
            lblid.Text= row.Cells[0].Text;
        }
      

  12.   


    那不是废话吗...我肯定变通过了,还是没有用,如果你觉得可以,可以把我的代码复制到一个新建的页面.
    数据很简单 我写下
    create database test
    go
    create table bbb
    (
       id int identity primary key,
       name varchar(50)
    )insert into bbb
    values('aa')
    insert into bbb
    values('bb')
      

  13.   

    for (int i = 0; i < GridView1.Rows.Count; i++)
    {
    GridView.DataKeys[i].Value.ToString()
    }
      

  14.   


    建议你看 Scott Michell 的那个asp.net2.0系列文章。使用“if (!IsPostBack) ”以及“GridView1.DataBind(); ”都是asp.net1.1的写法,可能你读的入门教材的作者比较喜欢asp.net1.1的写法。这种写法,你会在很多不应该读取后台数据库的地方强行绑定数据,会有错误的应用程序逻辑。使用asp.net2.0的数据绑定控件,它把最合理的数据绑定和更新逻辑给你封装起来,MVC风格编程使你减少了错误。
      

  15.   

    http://www.google.cn/search?complete=1&hl=zh-CN&newwindow=1&rlz=1T4GGIJ_zh-CNCN277CN277&q=scott+Mitchell+asp.net2.0&btnG=Google+%E6%90%9C%E7%B4%A2&meta=lr%3Dlang_zh-CN%7Clang_zh-TW&aq=-1&oq=注意,asp.net2.0的数据绑定控件不用手写“GridView1.DataBind();”这种代码,这是关键点。
      

  16.   

    我找到一个问题所在了
    e.Row.Attributes.Add("onClick", "javascript:__doPostBack('" + GridView1.ID + "','Select$" + e.Row.RowIndex + "');");我前台应该少了一段JS的函数.这段代码是通过朋友COPY过来的,有没有朋友可以帮忙写下这个函数.
      

  17.   

    那应该是在前台做功夫吧?                
    <a href='**.aspx?Id='<%#Eval("BulletinId") %>' target="main"><%#Eval("**")%></a>
    SelectedIndexChanging和SelectedIndexChanged都不用
    对不起 本人菜鸟
      

  18.   

    看看是不是你要的效果<html xmlns="http://www.w3.org/1999/xhtml" > 
    <head id="Head1" runat="server"> 
        <title>无标题页 </title> 
        <script type="text/javascript">
            function showID(str)
            {
            //    alert(str);
                document.getElementById("Label1").innerText = str;
            }
        </script>
    </head> 
    <body> 
        <form id="form1" runat="server"> 
            <asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound">
            </asp:GridView>
            <asp:Label ID="Label1" runat="server"></asp:Label>
         </form> 
    </body> 
    </html> protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindGridView();
        }
    }private void BindGridView()
    {
        SqlConnection cn = new SqlConnection(@"server=localhost;uid=sa;pwd=;database=test");
        SqlCommand cmd = new SqlCommand("select * from bbb", cn);
        cn.Open();
        GridView1.DataSource = cmd.ExecuteReader();
        GridView1.DataKeyNames = new string[] { "id" };
        GridView1.DataBind();
        cn.Close();
    }protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            e.Row.Attributes.Add("onClick", "showID('" + GridView1.DataKeys[e.Row.RowIndex].Value.ToString() + "')");
     //       e.Row.Attributes.Add("onClick", "alert('" + GridView1.DataKeys[e.Row.RowIndex].Value.ToString()  + "')");
        }
      

  19.   

    用dopostback伪执行服务器端引起回发控件动作
    首先,要了解__doPostBack函数的两个参数的含义:第一个参数所指是引起回发的控件源在客户端的引用.第二个参数指你在其它函数调用时想引用的代表_eventargument,而前者在客户端可以通过eventtarget来获取.第二个参数如果不需要可以以空字符串省略.
    楼主请看,应该是形如:__doPostBack__doPostBack('"+((LinkButton)e.Item.Cells[5].Controls[0]).ClientID.Replace("__","$_")+"','')此时为什么要用replace转换呢,因为它是在容器控件里,到了客户端会失真解析成另外的样子.onclick事件触发
     e.Item.Attributes.Add("ondblclick","__doPostBack('"+((LinkButton)e.Item.Cells[5].Controls[0]).ClientID.Replace("__","$_")+"','')");
    请参考:http://blog.csdn.net/LoveCherry/archive/2005/05/21/377325.aspx
      

  20.   

    LZ参考下下面这个帖子
    希望能对你有所帮助http://topic.csdn.net/u/20080602/20/a59ff45b-ee6f-4650-8613-0fe518fc96ba.html
      

  21.   


    你这个有点跑题了,这个头象借来玩玩而已,我问的问题,你这点水平根本无法解决,不然会让我的楼贴的如此高吗?这里是技术区,不是吵架区,我老师4个星星,我2个三角,你才三个三角,咋们半斤八两,而且我问的问题,你觉得以你的资历可以回答出来吗?我个人刚出道,确实不行,但你不要侮辱我的老师,我说过一句话,要批评别人就把实力给拿出来,你整了半天,狗屁代码都没有写出来,你解决的了问题再来发话.PS:今天刚上班,没有来的及看上面的回贴,我测试下,如果OK 就结帖了,谢谢大家这么多人的帮忙.