using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public partial class _Default : System.Web.UI.Page 
{
    private const int _firstEdITCellIndex = 2; 
    DataSet dataSet=new DataSet();
    DataTable dt_biao = new DataTable();
    DataSet ds = new DataSet();    public class GridViewTemplateTextBox : ITemplate
    {
        private DataControlRowType templateType;
        private string columnName;
        private string dataField;  
        public GridViewTemplateTextBox(DataControlRowType type, string colname, string datafield)
        {   
  
        templateType = type;   
        columnName = colname; 
        dataField = datafield;   
  
    }   
        public void InstantiateIn(System.Web.UI.Control container)
        {
            switch (templateType)
            {
                case DataControlRowType.Header:
                    Literal lc = new Literal();
                    lc.Text = columnName;
                    container.Controls.Add(lc);
                    break;
                case DataControlRowType.DataRow:
                    LinkButton tb = new LinkButton();
                    tb.ID = container.ClientID;
                    tb.DataBinding += new EventHandler(tb_DataBinding);
                    container.Controls.Add(tb); 
                    DropDownList drr = new DropDownList();
                    drr.Visible = false;
                    drr.ID = "dropdown";
                    string query = "select sSystemName from tb_SingleSystem";
                    string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=HxFutures;Integrated Security=True;";
                    SqlConnection myConnection = new SqlConnection(connectionString);
                    SqlDataAdapter ad = new SqlDataAdapter(query, myConnection);
                    DataSet ds = new DataSet();
                    ad.Fill(ds);
                    drr.AppendDataBoundItems = true;
                    drr.DataSource = ds.Tables[0];///品种选择下拉列表框绑定
                    drr.DataTextField = ds.Tables[0].Columns[0].ToString();///绑定text值
                    drr.DataValueField = ds.Tables[0].Columns[0].ToString();///绑定value值
                    drr.Items.Add(new ListItem("-----请选择------", ""));
                    container.Controls.Add(drr);
                    break;
                default:
                    break;
            }
        }
        private void tb_DataBinding(object sender, EventArgs e)
        {
            LinkButton tb = (LinkButton)sender;
            tb.Width = Unit.Percentage(100);
            GridViewRow container = (GridViewRow)tb.NamingContainer;
            tb.Text = ((DataRowView)container.DataItem)[dataField].ToString();
            tb.Width = Unit.Pixel(70);
            tb.Style.Add("TEXT-ALIGN", "right");
        }   
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            string query = "select sVariety from tb_Variety";
            string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=HxFutures;Integrated Security=True;";
            SqlConnection myConnection = new SqlConnection(connectionString);
            SqlDataAdapter ad = new SqlDataAdapter(query, myConnection);
            ad.Fill(ds);
            dt_biao.Columns.Add("", typeof(System.String));
            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                dt_biao.Columns.Add(ds.Tables[0].Rows[i]["sVariety"].ToString(), typeof(System.String));
            }
            int b = 2;
            for (int i = 0; i < b; i++)
            {
                DataRow dr = dt_biao.NewRow();
                dr[0] = "系统" + i.ToString();
                dr[1] = i.ToString();
                int a = i + 1;
                dr[2] = a.ToString();
                int c = a + 1;
                dr[2] = c.ToString();
                dt_biao.Rows.Add(dr);
            }
            Session["DT"] = dt_biao;  
       
            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                TemplateField customField = new TemplateField();
                customField.ShowHeader = true;
                customField.HeaderTemplate = new GridViewTemplateTextBox(DataControlRowType.Header, ds.Tables[0].Rows[i]["sVariety"].ToString(), dt_biao.Columns[i + 1].ToString());
                customField.ItemTemplate = new GridViewTemplateTextBox(DataControlRowType.DataRow, ds.Tables[0].Rows[i]["sVariety"].ToString(), dt_biao.Columns[i + 1].ToString());
                GridView1.Columns.Add(customField);
            }
            GridView1.DataSource = dt_biao;
            GridView1.DataBind();
        }
        if (this.GridView1.SelectedIndex > -1) 
        { 
            this.GridView1.UpdateRow(this.GridView1.SelectedIndex, false); 
        }     }
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            // 从第一个单元格内获得LinkButton控件 
            LinkButton _singleClickButton = (LinkButton)e.Row.Cells[0].Controls[0];
            // 返回一个字符串,表示对包含目标控件的 ID 和事件参数的回发函数的 JAVAScript 调用 
            string _jsSingle = ClientScript.GetPostBackClientHyperlink(_singleClickButton, "");
            // 给每一个可编辑的单元格增加事件 
            for (int columnIndex = _firstEdITCellIndex; columnIndex < e.Row.Cells.Count; columnIndex++)
            {
                // 增加列索引作为事件参数 
                string js = _jsSingle.Insert(_jsSingle.Length - 2, columnIndex.ToString());
                // 给单元格增加onclick事件 
                e.Row.Cells[columnIndex].Attributes["onclick"] = js;
                // 给单元格增加鼠标经过时指针样式 
                e.Row.Cells[columnIndex].Attributes["style"] += "cursor:pointer;cursor:hand;";
            }         } 
    }
 

解决方案 »

  1.   

       protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            GridView _gridView = (GridView)sender;
            switch (e.CommandName)
            {
                case ("SingleClick"):
                    // 获得行索引 
                    int _rowIndex = int.Parse(e.CommandArgument.ToString());
                    // 解析事件参数(在RowDataBound中增加的),从而获得被选中的列的索引 
                    int _columnIndex = int.Parse(Request.Form["__EVENTARGUMENT"]);
                    // 设置GridView被选中的行的索引(每次回发后判断GridView1.SelectedIndex > -1则更新) 
                    _gridView.SelectedIndex = _rowIndex;
                    // 绑定 
                    _gridView.DataBind(); 
                    //GVDataBind(); 
                    // 获得被选中单元格的显示控件并设置其不可见 
                    Control _displayControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[0];
                    _displayControl.Visible = false;
                    // 获得被选中单元格的编辑控件并设置其可见 
                    Control _edITControl = _gridView.Rows[_rowIndex].Cells[_columnIndex].Controls[1];
                    _edITControl.Visible = true;
                    // 清除被选中单元格属性以删除click事件 
                    _gridView.Rows[_rowIndex].Cells[_columnIndex].Attributes.Clear();
                    // 设置焦点到被选中的编辑控件 
                    ClientScript.RegisterStartupScript(GetType(), "SetFocus",
                        " <script>document.getElementById('" + _edITControl.ClientID + "').focus(); </script>");
                    // 如果编辑控件是DropDownList的话,那么把SelectedValue设置为显示控件的值 
                    if (_edITControl is Label && _displayControl is DropDownList)
                    {
                        ((Label)_edITControl).Text = ((DropDownList)_displayControl).Text;
                    }
                    // 如果编辑控件是TextBox的话则选中文本框内文本 
                    if (_edITControl is Label)
                    {
                        ((Label)_edITControl).Attributes.Add("onfocus", "this.select()");
                    }
                    break;
                case ("RefreshList"):
                    GridView gridView = (GridView)sender;
                    int rowIndex = Convert.ToInt32(e.CommandArgument);
                    string value = "";
                    // 获得单元格里的控件 
                    Control editControl = gridView.Rows[rowIndex].Cells[_firstEdITCellIndex].Controls[1];
                    // 如果单元格处于编辑模式的话,那么从编辑控件中获取值 
                    if (editControl.Visible)
                    {
                        if (editControl is Label)
                        {
                            value = ((Label)editControl).Text;
                            GridView1.EditIndex = -1;
                            //  bind2(); 
                        }
                    }
                    break;
            } 
        }
        protected override void Render(HtmlTextWriter wrITer)
        {
            foreach (GridViewRow r in GridView1.Rows)
            {
                if (r.RowType == DataControlRowType.DataRow)
                {
                    for (int columnIndex = _firstEdITCellIndex; columnIndex < r.Cells.Count; columnIndex++)
                    {
                        Page.ClientScript.RegisterForEventValidation(r.UniqueID + "$ctl00", columnIndex.ToString());
                    }
                }
            }
            base.Render(wrITer);
        }
        protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            GridView _gridView = (GridView)sender; 
            string key = ""; 
            string value = ""; 
            // NewValues集合里的key 
            string[] _columnKeys = new string[] { "LastName", "FirstName", "Country" }; 
            if (e.RowIndex > -1) 
            { 
                // 循环每一列 
                for (int i = _firstEdITCellIndex; i < _gridView.Columns.Count; i++) 
                { 
                    // 获得单元格里的控件 
                    Control _displayControl = _gridView.Rows[e.RowIndex].Cells[i].Controls[0]; 
                    Control _edITControl = _gridView.Rows[e.RowIndex].Cells[i].Controls[1]; 
                    // 获得列的key 
                    key = _columnKeys[i - _firstEdITCellIndex]; 
                    // 如果单元格处于编辑模式的话,那么从编辑控件中获取值 
                    if (_edITControl.Visible) 
                    { 
                        if (_edITControl is TextBox) 
                        { 
                            value = ((TextBox)_edITControl).Text; 
                        } 
                        else if (_edITControl is DropDownList) 
                        { 
                            value = ((DropDownList)_edITControl).SelectedValue; 
                        }                     // 增加key/value对到NewValues集合 
                        e.NewValues.Add(key, value); 
                    } 
                    // 否则从显示控件中获取值 
                    else 
                    { 
                        value = ((Label)_displayControl).Text.ToString();                     // 增加key/value对到NewValues集合 
                        e.NewValues.Add(key, value); 
                    } 
                } 
            } 
        }
    }