如何用datagird控件设置某行不可编辑?请给出代码实现.

解决方案 »

  1.   

    给不需要编辑的行加个标记,加上CommandName="NoEdit"
    在ItemEdit方法中
    if(e.CommandName=="NoEdit")
    {
      //不编辑
    }
    else
    {
      进行编辑
    }
      

  2.   

    给不需要编辑的行加个标记,加上CommandName="NoEdit"
    在ItemEdit方法中
    if(e.CommandName=="NoEdit")
    {
      //不编辑
    }
    else
    {
      进行编辑
    }
      

  3.   

    楼主请参考://.aspx
    <asp:DataGrid ID="dg" runat="server" AutoGenerateColumns="true" OnEditCommand="Edit">
        <Columns>
            <asp:TemplateColumn>
                <ItemTemplate>
                    <asp:Label ID="lblEdit" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "CanEditable") %>' />
                </ItemTemplate>
            </asp:TemplateColumn>
            <asp:EditCommandColumn CancelText="取消" UpdateText="更新" EditText="编辑" />
        </Columns>
    </asp:DataGrid>.cs:
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            BindData();
    }//绑定数据到DataGird
    private void BindData()
    {
        dg.DataSource = CreateData();
        dg.DataBind();
    }//创建随机数据(楼主可以从数据库里读取
    private DataTable CreateData()
    {
        DataTable dt = new DataTable();
        DataColumn dc = new DataColumn("Value");
        DataColumn dc1 = new DataColumn("CanEditable");
        dt.Columns.Add(dc);
        dt.Columns.Add(dc1);    for (int i = 0; i < 10; i++)
        {
            DataRow dr = dt.NewRow();
            dr[0] = i;
            dr[1] = i % 2 == 0 ? "可编辑" : "不可编辑";        dt.Rows.Add(dr);
        }    return dt;
    }//编辑
    protected void Edit(object sender, DataGridCommandEventArgs e)
    {
        //根据Label控件中的值来判断是否可以编辑
        //也可以自己设置一个值来判断是否可编辑
        Label lbl = e.Item.FindControl("lblEdit") as Label;
        if (lbl != null)
        {
            if (lbl.Text == "可编辑")
            {
                dg.EditItemIndex = e.Item.ItemIndex;            BindData();
            }
        }
    }
      

  4.   

    //很早以前的了,变颜色也有,//用法:复制过来的哈
    DataGridTextBoxColumnIETSPC aColumnTextColumn = new DataGridTextBoxColumnIETSPC();
    aColumnTextColumn.InitCell +=new MyCellEventHandler(aColumnTextColumn_InitCell);private void aColumnTextColumn_InitCell(object sender, MyDataGridEventArgs e)
    {
    e.Enable = false;
    }
    using System;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Windows.Forms;namespace System.Windows.Forms
    {
    public class MyDataGridEventArgs : EventArgs
    {
    private int _column;
    private int _row;
    private bool _enable;
    private TextBox _textbox;
    private Font _font;
    private Brush _backBrush;
    private Brush _foreBrush;
    private bool _useBaseClassDrawing;
    private string _value;
    public MyDataGridEventArgs(int row, int col, bool val, TextBox tb, Font font1, Brush backBrush, Brush foreBrush,string text)
    {
    _row = row;
    _column = col;
    _enable = val;
    _textbox = tb;
    _backBrush = backBrush;
    _foreBrush = foreBrush;
    _useBaseClassDrawing = false;
    _value = text;
    }
    public string Value
    {
    get{return _value;}
    }
    /// <summary>
    /// 获取DataGrid的列
    /// </summary>
    public int Column
    {
    get{ return _column;}
    //set{ _column = value;}
    }
    /// <summary>
    /// 获取DataGrid的行
    /// </summary>
    public int Row
    {
    get{ return _row;}
    //set{ _row = value;}
    }
    /// <summary>
    /// 设置或获取一个值,是否响应和用户互交
    /// </summary>
    public bool Enable
    {
    get{ return _enable;}
    set{ _enable = value;}
    }
    /// <summary>
    /// 设置或获取Cell的TextBox控件,测试而已
    /// </summary>
    private TextBox TextBox
    {
    get{ return _textbox;}
    set{ _textbox = value;}
    }
    /// <summary>
    /// 获取或设置Cell的字体
    /// </summary>
    public Font TextFont
    {
    get{ return _font;}
    set{ _font = value;}
    }
    /// <summary>
    /// 获取或设置一个Brush对象,用于Cell背景Brush
    /// </summary>
    public Brush BackBrush
    {
    get{ return _backBrush;}
    set{ _backBrush = value;}
    }
    /// <summary>
    /// 获取或设置一个Brush对象,用于Cell前景Brush
    /// </summary>
    public Brush ForeBrush
    {
    get{ return _foreBrush;}
    set{ _foreBrush = value;}
    }
    /// <summary>
    /// 获取或设置,是否启用系统默认设置,默认为false
    /// </summary>
    public bool UseBaseClassDrawing
    {
    get{ return _useBaseClassDrawing;}
    set{ _useBaseClassDrawing = value;}
    }
    } public delegate void MyCellEventHandler(object sender, MyDataGridEventArgs e); /// <summary>
    /// dsfsdf
    /// </summary>
    public class DataGridTextBoxColumnIETSPC : DataGridTextBoxColumn
    {
    /// <summary>
    /// 当DataGrid在绘制时发生
    /// </summary>
    public event MyCellEventHandler InitCell;

    private int _col;
    private Color _currentTextBoxBackColor; /// <summary>
    /// 获取或设置当前活动Cell的背景颜色
    /// </summary>
    public Color CurrentTextBoxBackColor
    {
    get{return _currentTextBoxBackColor;}
    set{_currentTextBoxBackColor = value;}
    }
    public DataGridTextBoxColumnIETSPC()
    {
    _col = -1;
    _currentTextBoxBackColor = Color.White;
    TextBox.KeyPress +=new KeyPressEventHandler(TextBox_KeyPress);
    }
    public DataGridTextBoxColumnIETSPC(int column):base()
    {
    _col = column;
    } protected override void Paint(System.Drawing.Graphics g, System.Drawing.Rectangle bounds, System.Windows.Forms.CurrencyManager source, int rowNum, System.Drawing.Brush backBrush, System.Drawing.Brush foreBrush, bool alignToRight)
    {
    bool enabled = true;
    DataGrid grid = this.DataGridTableStyle.DataGrid;
    if (_col == -1)
    {
    int i = this.DataGridTableStyle.GridColumnStyles.IndexOf(this);
    if (i > -1)
    _col = i;
    }
    if(grid.CurrentRowIndex == rowNum && grid.CurrentCell.ColumnNumber == _col)
    {
    TextBox.BackColor = _currentTextBoxBackColor;
    }
    if(InitCell != null)
    {
    string str = (string) GetColumnValueAtRow(source,rowNum);
    MyDataGridEventArgs e = new MyDataGridEventArgs(rowNum, _col, enabled, TextBox, this.DataGridTableStyle.DataGrid.Font, backBrush, foreBrush,str);
    InitCell(this, e);
    backBrush = e.BackBrush;
    foreBrush = e.ForeBrush;
    if(!e.Enable)
    backBrush = Brushes.LightGray;
    }
    base.Paint(g, bounds, source, rowNum, backBrush, foreBrush, alignToRight);
    }
    protected override void Edit(System.Windows.Forms.CurrencyManager source, int rowNum, System.Drawing.Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible)
    {

    bool enabled = true;
    if(InitCell != null)
    {
    MyDataGridEventArgs e = new MyDataGridEventArgs(rowNum, _col, enabled,TextBox, this.DataGridTableStyle.DataGrid.Font, null, null,null);
    InitCell(this, e);
    enabled = e.Enable;
    }
    if(enabled)
    {
    base.Edit(source, rowNum, bounds, readOnly, instantText, cellIsVisible);
    }
    else
    {
    SendKeys.Send("{Enter}");
    }
    TextBox.ReadOnly = !enabled;
    }
    protected override void Dispose(bool disposing)
    {
    if(disposing)
    {
    TextBox.KeyPress -= new KeyPressEventHandler(TextBox_KeyPress);
    }
    base.Dispose (disposing);
    }
    private void TextBox_KeyPress(object sender, KeyPressEventArgs e)
    {
    if(!char.IsControl(e.KeyChar) && !char.IsNumber(e.KeyChar) && e.KeyChar !=  '.' && e.KeyChar != '-')
    {
    e.Handled = true;
    }
    }
    }
    }