注意:我不是在gridview的事件里写代码,所以,象e.rowindex之类的无法用,我是在按钮的onclick中取当前行。protected void btnSelect1_Click(object sender, EventArgs e)
    {
          GridViewRow MyRow = GridView1.SelectedRow;     //为什么MyRow是null呢?         ((TextBox)MyRow.FindControl("edtWpbh")).Text ="123"HdfWpbh.Value;
        }
    }我这个按钮放在gridview中。点击它时想取得当前行。

解决方案 »

  1.   


    这样得到行Index
    protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                LinkButton lbView = (LinkButton)e.Row.FindControl("BtnView");
                if (lbView != null)
                {
                    lbView.CommandArgument = e.Row.RowIndex.ToString();
                }//这样执行操作(点击button的操作)
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "BtnView")
            {
                string id = this.GridView1.DataKeys[Convert.ToInt32(e.CommandArgument.ToString())].Value.ToString();
                ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript", "<script>btview('" + id.Trim() + "');</script>");
            }
      

  2.   

    我的这个按钮不是一个command按钮,就是一个普通的按钮。楼上的搞得太复杂了吧?
      

  3.   

    在一般人所容易理解的设计中,Button的职责很清楚,GridView的职责很清楚,Button是嵌入GridView作为GridView的组成部分而存在。因此你说的“注意:我不是在gridview的事件里写代码”是一种明显将职责放错地方的做法。孔子说:道不同不相为谋,职责过于错位,好的设计者就很可能回避你的代码,不会把自己的程序与你写的代码放在一起。
      

  4.   

    sp1234 :我是想在gridview中嵌入一个按钮,点击它时,弹出一个查找窗口。这样的职责有错吗?我在c/s中习惯这样的,我对b/s开发不熟悉。请指教。
      

  5.   

    上面的是在模板列里加的一个LinkButton 
    通过LinkButton的CommandArgument 来获取点击按钮的行号如果你用的是GridView里自带的ButtonField的话
    你编写GridView的RowCommand事件
    如下:
    string aaa = e.CommandName.ToString();
            if (aaa.Equals("button"))
            {
                int aab = int.Parse(e.CommandArgument.ToString());
            }
      

  6.   

    利用下面得方法就可以了:
    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:Button ID="Button1" runat="server" Text="Button" CommandArgument=" <%#Container.DataItemIndex %>"/>
                           
                        </ItemTemplate>
                    </asp:TemplateField>     protected void btnSelect1_Click(object sender, EventArgs e) 
        { 
              (Button)bt=(Button)sender;
              int i=(int)bt.CommandArgument;        ((TextBox)this.GrideView1.Rows[i].FindControl("edtWpbh")).Text ="123"HdfWpbh.Value; 
            } 
        } 
      

  7.   

    lcl_8318 :你的代码有问题啊?那个bt是怎么回事? 
    (Button)bt=(Button)sender;  //出错:上下文中不存在btn
      

  8.   

    vs2005中:
    例如点击了当前行是个LinkButton
    protected   void   LinkButton1_Command(object   sender,   CommandEventArgs   e) 

     LinkButton   lb   =   (LinkButton)sender; 
     DataControlFieldCell   dcf   =   (DataControlFieldCell)lb.Parent; 
     GridViewRow   gvr   =   (GridViewRow)dcf.Parent; 
     GridView1.SelectedIndex   =   gvr.RowIndex; 

    vs2003中:
    例如点击了当前行是个DropDownList
    private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e)
    {
      
     DataGridItem di = (sender as DropDownList).Parent.Parent as DataGridItem;
     int index = Convert.ToInt32(di.ItemIndex);
    }
    //有人会问了,为什么有两个Parent呢?
    //第一个Parent是指DropDownList所在的单元格,第二个Parent就是指DropDownList所在的行了
      

  9.   

    vs2005中:
    例如点击了当前行是个LinkButton
    protected   void   LinkButton1_Command(object   sender,   CommandEventArgs   e) 

     LinkButton   lb   =   (LinkButton)sender; 
     DataControlFieldCell   dcf   =   (DataControlFieldCell)lb.Parent; 
     GridViewRow   gvr   =   (GridViewRow)dcf.Parent; 
     GridView1.SelectedIndex   =   gvr.RowIndex; 

    vs2003中:
    例如点击了当前行是个DropDownList
    private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e)
    {
      
     DataGridItem di = (sender as DropDownList).Parent.Parent as DataGridItem;
     int index = Convert.ToInt32(di.ItemIndex);
    }
    //有人会问了,为什么有两个Parent呢?
    //第一个Parent是指DropDownList所在的单元格,第二个Parent就是指DropDownList所在的行了
      

  10.   

    lcl_8318 :你的代码不能用啊?
      

  11.   

    晕 写错了 是bt.CommandArgument
      

  12.   

    继续晕 lcl_8318写的代码不全吖 我还直接引用的呢 Button 的点击事件都没有声明吖 楼主大致参考 别copy
      

  13.   

    button bt = sender as button; 
    int index = Convert.ToInt32(button.CommandArgument); 这里有改动 这样不会报错的还有 我只是改动下lcl_8318的代码 对于楼主的需求我没太明白.....
      

  14.   

    <asp:TemplateField> 
         <ItemTemplate> 
              <asp:Button ID="Button1" runat="server" Text="Button" CommandName=" select">    
         </ItemTemplate> 
     </asp:TemplateField> 
    在点击此按钮会触发selecgindexchanging事件,在事件中写e.RowIndex就行了
      

  15.   

    如果你的BUTTON放在gridview中,要触发这个按钮的事件,必须在command中设置事件名,否则你就必须获取它的生成网页以后的ID名,建议用COMMAND
      

  16.   

    问题解决了,多谢各位,尤其是lcl_8318和hubblebubblepig!