this.Textbox1.DataBindings[0].Format+=new ConvertEventHandler(DecimalToCurrencyString);private void DecimalToCurrencyString(object sender, ConvertEventArgs cevent)
{
if(cevent.DesiredType != typeof(Datetime)) return;if(cevent.Value != System.DBNull.Value)//regardless of the Value of DBNull
cevent.Value = System.DBNull.Value;//不显示
}

解决方案 »

  1.   

    如果是webform的可以用数据来源控制,来源不直接用表字段,而是调用一函数,用if语句调整,显示和修改时用调整后的变量。
    显示时用label,设置每一行.
    <%@ Import Namespace="System.Data.SqlClient" %>
    <%@ Import Namespace="System.Data" %>
    <html>
      <body>
        <form method=post runat="server">
          <asp:DataGrid runat="server" ID="Datagrid1"
            DataKeyField="EmployeeID"
            OnEditCommand="Datagrid1_Edit"
            OnUpdateCommand="Datagrid1_Update"
            OnCancelCommand="Datagrid1_Cancel"
            OnDeleteCommand="Datagrid1_Delete"
            AutoGenerateColumns="False"
            Width="100%"
            HeaderStyle-Font-Size="10"
            HeaderStyle-Font-Bold="true"
            HeaderStyle-ForeColor="Red"
            HeaderStyle-BackColor="Yellow"
            HeaderStyle-BorderColor="Red"
            HeaderStyle-BorderWidth="5"
            FooterStyle-BorderColor="Red"
            FooterStyle-BorderWidth="5"    
            ItemStyle-BackColor="LightCyan"
            ItemStyle-ForeColor="DarkBlue"        
            AlternatingItemStyle-BackColor="LightYellow"
            AlternatingItemStyle-ForeColor="Maroon">
            <Columns>
              <asp:EditCommandColumn ItemStyle-Width="25px"
                EditText="<img border=0 alt='Edit record' src=Edit.gif>"
                CancelText="<img border=0 alt='Cancel changes' src=Cancel.gif>"
                UpdateText="<img border=0 alt='Accept changes'  src=OK.gif>"
              />
    <asp:ButtonColumn ItemStyle-Width="25px" ButtonType="LinkButton"
      Text="<img border=0 src=Delete.gif>" CommandName="delete"
    />
              <asp:BoundColumn HeaderText="ID" ItemStyle-Width="30px" DataField="EmployeeID" ReadOnly="true" />
              <asp:TemplateColumn HeaderText="Title" ItemStyle-Width="50px">
                <ItemTemplate>
                  <%# DataBinder.Eval(Container.DataItem, "TitleOfCourtesy") %>          
                </ItemTemplate>
                <EditItemTemplate>
                  <asp:DropDownList runat="server" ID="EditTitle" DataSource='<%# TitlesOfCourtesy %>'
                    SelectedIndex='<%# GetSelectedTitle(DataBinder.Eval(Container.DataItem, "TitleOfCourtesy")) %>' />
                </EditItemTemplate>
              </asp:TemplateColumn>
              <asp:TemplateColumn HeaderText="Name">
                <ItemTemplate>
                  <b><%# DataBinder.Eval(Container.DataItem, "LastName") %></b>,
                  <%# DataBinder.Eval(Container.DataItem, "FirstName") %>          
                </ItemTemplate>
                <EditItemTemplate>
                  <asp:TextBox runat="server" ID="EditLastName" Text='<%# DataBinder.Eval(Container.DataItem, "LastName") %>' />
                  <asp:TextBox runat="server" ID="EditFirstName" Text='<%# DataBinder.Eval(Container.DataItem, "FirstName") %>' />
                </EditItemTemplate>
              </asp:TemplateColumn>
              <asp:BoundColumn HeaderText="City" ItemStyle-Width="150px" DataField="City" />
              <asp:TemplateColumn HeaderText="USA?" ItemStyle-Width="35px" ItemStyle-HorizontalAlign="Center">
                <ItemTemplate>
                  <asp:CheckBox runat="server" Enabled="false"
                    Checked='<%# DataBinder.Eval(Container.DataItem, "Country").ToString() == "USA" %>' />
                </ItemTemplate>
              </asp:TemplateColumn>
            </Columns>
          </asp:DataGrid>
        </form>
      </body>
    </html><script runat="server" language="C#">
      public string[] TitlesOfCourtesy 
      {
        get {
          return new string[4]{"Mr.", "Dr.", "Ms.", "Mrs."};
        }
      }
      
      int GetSelectedTitle(object title)
      {
        return Array.IndexOf(TitlesOfCourtesy, title.ToString());
      }
      
      void Page_Load()
      {
        if (!Page.IsPostBack)
          BindGrid();
      }
      
      void BindGrid()
      {
        // create the command and the connection
        string connString = "server=(local);database=Northwind;uid=sa;pwd=;";
        string sql = @"SELECT * FROM Employees";
        SqlConnection conn = new SqlConnection(connString);
        SqlCommand cmd = new SqlCommand(sql, conn);
          
        // open the connection and get the Reader
        conn.Open();
        SqlDataReader reader = cmd.ExecuteReader();
               
        // bind the reader to the DataList
        Datagrid1.DataSource = reader;
        Datagrid1.DataBind();
          
        // close the reader and the connection
        reader.Close();
        conn.Close();
      }
      
      void Datagrid1_Edit(Object sender, DataGridCommandEventArgs e)
      {
        Datagrid1.EditItemIndex = (int)e.Item.ItemIndex;
        BindGrid();
      }
      
      void Datagrid1_Cancel(Object sender, DataGridCommandEventArgs e)
      {
        Datagrid1.EditItemIndex = -1;
        BindGrid();
      }  void Datagrid1_Update(Object sender, DataGridCommandEventArgs e)
      {
        // get the ID of the record to update
        int empID = (int)Datagrid1.DataKeys[e.Item.ItemIndex];
        
        // get the references to the edit controls
        DropDownList title = (DropDownList)e.Item.FindControl("EditTitle");
        TextBox lastName = (TextBox)e.Item.FindControl("EditLastName");
        TextBox firstName = (TextBox)e.Item.FindControl("EditFirstName");
        TextBox city = (TextBox)e.Item.Cells[5].Controls[0];
        
        // create the connection and the UPDATE command
        string connString = "server=(local);database=Northwind;uid=sa;pwd=;";
        string sql = @"UPDATE Employees SET TitleOfCourtesy = @TitleOfCourtesy, 
          LastName = @LastName, FirstName = @FirstName, City = @City WHERE EmployeeID = @EmployeeID";
        SqlConnection conn = new SqlConnection(connString);
        SqlCommand cmd = new SqlCommand(sql, conn);
        
    // create the required parameters
        cmd.Parameters.Add(new SqlParameter("@TitleOfCourtesy", SqlDbType.NVarChar, 25));
    cmd.Parameters["@TitleOfCourtesy"].Value = title.SelectedItem.Text.Trim();
        cmd.Parameters.Add(new SqlParameter("@LastName", SqlDbType.NVarChar, 20));
    cmd.Parameters["@LastName"].Value = lastName.Text.Trim();
    cmd.Parameters.Add(new SqlParameter("@FirstName", SqlDbType.NVarChar, 10));
    cmd.Parameters["@FirstName"].Value = firstName.Text.Trim();
    cmd.Parameters.Add(new SqlParameter("@City", SqlDbType.NVarChar, 15));
    cmd.Parameters["@City"].Value = city.Text.Trim();
    cmd.Parameters.Add(new SqlParameter("@EmployeeID", SqlDbType.Int, 4));
    cmd.Parameters["@EmployeeID"].Value = empID;

        // execute the command
        cmd.Connection.Open();
        try {
          cmd.ExecuteNonQuery();
        }
        catch (SqlException) {
          // handle exception... 
        }
        finally { 
          cmd.Connection.Close();
        }
        
        // stop the editing and rebind the grid
        Datagrid1.EditItemIndex = -1;
        BindGrid();
      }
      
      void Datagrid1_Delete(Object sender, DataGridCommandEventArgs e)
      {
        // get the ID of the record to update
        int empID = (int)Datagrid1.DataKeys[e.Item.ItemIndex];
           
        // create the connection and the DELETE command
        string connString = "server=(local);database=Northwind;uid=sa;pwd=;";
        string sql = @"DELETE FROM Employees WHERE EmployeeID = " + empID.ToString();
        SqlConnection conn = new SqlConnection(connString);
        SqlCommand cmd = new SqlCommand(sql, conn);
        
        // execute the command
        cmd.Connection.Open();
        try {
          cmd.ExecuteNonQuery();
        }
        catch (SqlException) {
          // handle exception... 
        }
        finally { 
          cmd.Connection.Close();
        }
        
        // rebind the grid
        Datagrid1.EditItemIndex = -1;
        BindGrid();
      }
    </script>
      

  2.   

    我现在只要执行下面的语句,DATATABLE中的值就变了.if ( dataGrid1[3,3].ToShortDateString() == "2004-12-31")
    {
        dataGrid1[ 3,3 ] = DBNull.Value;
    }但是,我只是希望能够改变显示的值,而不改变DATATABLE中的值.请问,怎么实现?
      

  3.   

    可以使用自定义列样式,那样你就可以控制它的显示。这个msdn上有的
    using System;
    using System.Data;
    using System.Windows.Forms;
    using System.Drawing;// This example shows how to create your own column style that
    // hosts a control, in this case, a DateTimePicker.
    public class DataGridTimePickerColumn : DataGridColumnStyle 
    {
        private DateTimePicker myDateTimePicker = new DateTimePicker();
        // The isEditing field tracks whether or not the user is
        // editing data with the hosted control.
        private bool isEditing;    public DataGridTimePickerColumn() : base() 
        {
            myDateTimePicker.Visible = false;
        }    protected override void Abort(int rowNum)
        {
            isEditing = false;
            myDateTimePicker.ValueChanged -= 
                new EventHandler(TimePickerValueChanged);
            Invalidate();
        }    protected override bool Commit
            (CurrencyManager dataSource, int rowNum) 
        {
            myDateTimePicker.Bounds = Rectangle.Empty;
             
            myDateTimePicker.ValueChanged -= 
                new EventHandler(TimePickerValueChanged);        if (!isEditing)
                return true;        isEditing = false;        try 
            {
                DateTime value = myDateTimePicker.Value;
                SetColumnValueAtRow(dataSource, rowNum, value);
            } 
            catch (Exception) 
            {
                Abort(rowNum);
                return false;
            }        Invalidate();
            return true;
        }    protected override void Edit(
            CurrencyManager source, 
            int rowNum,
            Rectangle bounds, 
            bool readOnly,
            string instantText, 
            bool cellIsVisible) 
        {
            DateTime value = (DateTime) 
                GetColumnValueAtRow(source, rowNum);
            if (cellIsVisible) 
            {
                myDateTimePicker.Bounds = new Rectangle
                    (bounds.X + 2, bounds.Y + 2, 
                    bounds.Width - 4, bounds.Height - 4);
                myDateTimePicker.Value = value;
                myDateTimePicker.Visible = true;
                myDateTimePicker.ValueChanged += 
                    new EventHandler(TimePickerValueChanged);
            } 
            else 
            {
                myDateTimePicker.Value = value;
                myDateTimePicker.Visible = false;
            }        if (myDateTimePicker.Visible)
                DataGridTableStyle.DataGrid.Invalidate(bounds);
        }    protected override Size GetPreferredSize(
            Graphics g, 
            object value) 
        {
            return new Size(100, myDateTimePicker.PreferredHeight + 4);
        }    protected override int GetMinimumHeight() 
        {
            return myDateTimePicker.PreferredHeight + 4;
        }    protected override int GetPreferredHeight(Graphics g, 
            object value) 
        {
            return myDateTimePicker.PreferredHeight + 4;
        }    protected override void Paint(Graphics g, 
            Rectangle bounds, 
            CurrencyManager source, 
            int rowNum) 
        {
            Paint(g, bounds, source, rowNum, false);
        }
        protected override void Paint(
            Graphics g, 
            Rectangle bounds,
            CurrencyManager source, 
            int rowNum,
            bool alignToRight) 
        {
            Paint(
                g,bounds, 
                source, 
                rowNum, 
                Brushes.Red, 
                Brushes.Blue, 
                alignToRight);
        }
        protected override void Paint(
            Graphics g, 
            Rectangle bounds,
            CurrencyManager source, 
            int rowNum,
            Brush backBrush, 
            Brush foreBrush,
            bool alignToRight) 
        {
            DateTime date = (DateTime) 
                GetColumnValueAtRow(source, rowNum);
            Rectangle rect = bounds;
            g.FillRectangle(backBrush,rect);
            rect.Offset(0, 2);
            rect.Height -= 2;
            g.DrawString(date.ToString("d"), 
                this.DataGridTableStyle.DataGrid.Font, 
                foreBrush, rect);
        }    protected override void SetDataGridInColumn(DataGrid value) 
        {
            base.SetDataGridInColumn(value);
            if (myDateTimePicker.Parent != null) 
            {
                myDateTimePicker.Parent.Controls.Remove 
                    (myDateTimePicker);
            }
            if (value != null) 
            {
                value.Controls.Add(myDateTimePicker);
            }
        }    private void TimePickerValueChanged(object sender, EventArgs e) 
        {
            this.isEditing = true;
            base.ColumnStartedEditing(myDateTimePicker);
        }
    }
    namespace DataGridColumnStyleExample 
    {
        using System;
        using System.Data;
        using System.Windows.Forms;
        using System.Drawing;
        using System.ComponentModel;
        public class MyForm : Form 
        {
            private DataTable namesDataTable;
            private DataGrid grid = new DataGrid();
            public MyForm() : base() 
            {
                InitForm();            namesDataTable = new DataTable("NamesTable");
                namesDataTable.Columns.Add(new DataColumn("Name"));
                DataColumn dateColumn = new DataColumn 
                    ("Date", typeof(DateTime));
                namesDataTable.Columns.Add(dateColumn);
                DataSet namesDataSet = new DataSet();
                namesDataSet.Tables.Add(namesDataTable);
                grid.DataSource = namesDataSet;
                grid.DataMember = "NamesTable";
                AddGridStyle();
                AddData();
            }        private void AddGridStyle()
            {
                DataGridTableStyle myGridStyle = new DataGridTableStyle();
                myGridStyle.MappingName = "NamesTable";            DataGridTextBoxColumn nameColumnStyle = 
                    new DataGridTextBoxColumn();
                nameColumnStyle.MappingName = "Name";
                nameColumnStyle.HeaderText= "Name";
                myGridStyle.GridColumnStyles.Add(nameColumnStyle);            DataGridTimePickerColumn timePickerColumnStyle = 
                    new DataGridTimePickerColumn();
                timePickerColumnStyle.MappingName = "Date";
                timePickerColumnStyle.HeaderText = "Date";
                timePickerColumnStyle.Width = 100;
                myGridStyle.GridColumnStyles.Add(timePickerColumnStyle);            grid.TableStyles.Add(myGridStyle);
            }        private void AddData() 
            {
            
                DataRow dRow = namesDataTable.NewRow();
                dRow["Name"] = "Name 1";
                dRow["Date"] = new DateTime(2001, 12, 01);
                namesDataTable.Rows.Add(dRow);            dRow = namesDataTable.NewRow();
                dRow["Name"] = "Name 2";
                dRow["Date"] = new DateTime(2001, 12, 04);
                namesDataTable.Rows.Add(dRow);            dRow = namesDataTable.NewRow();
                dRow["Name"] = "Name 3";
                dRow["Date"] = new DateTime(2001, 12, 29);
                namesDataTable.Rows.Add(dRow);            dRow = namesDataTable.NewRow();
                dRow["Name"] = "Name 4";
                dRow["Date"] = new DateTime(2001, 12, 13);
                namesDataTable.Rows.Add(dRow);            dRow = namesDataTable.NewRow();
                dRow["Name"] = "Name 5";
                dRow["Date"] = new DateTime(2001, 12, 21);
                namesDataTable.Rows.Add(dRow);            namesDataTable.AcceptChanges();
            }        private void InitForm() 
            {
                this.Size = new Size(500, 500);
                grid.Size = new Size(350, 250);
                grid.TabStop = true;
                grid.TabIndex = 1;
                this.StartPosition = FormStartPosition.CenterScreen;
                this.Controls.Add(grid);
            }
            [STAThread]
            public static void Main() 
            {
                MyForm myForm1= new MyForm();
                myForm1.ShowDialog();
            }
        }
    }