Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,027

HOME > .NET Framework > Forum > C# WinApp ปัญหาการใส่ค่าใน property ของ User control ใน datagrid ครับ



 

C# WinApp ปัญหาการใส่ค่าใน property ของ User control ใน datagrid ครับ

 



Topic : 124690



โพสกระทู้ ( 4,434 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook



สืบเนื่องจาก http://www.thaicreate.com/dotnet/forum/124673.html
ผมลองเอามาใช้กับ Datagridview
ปรากฎว่าไม่ได้ผลครับ

ปัญหาคือ
กำหนดค่า SelectedMode แล้ว แต่พอรัน จะกลายเป็น colorDialog ตลอดเลยครับ
ตอนนี้แก้ปัญหาโดยการตั้งค่าใน form แบบนี้ครับ

Code (C#)
private void Form2_Load(object sender, EventArgs e)
        { 
            this.Column1.SelectedMode = TORServices.Forms.Datagridview.DataGridViewFilePathColumn.SelectedPathType.openFileDialog;
        }



นี่คือโค้ดที่เป็นปัญหาครับ
Code (C#)
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TORServices.Forms.Datagridview
{
    #region _DataGridViewFilePathColumn
    /// <summary>
    /// Hosts a collection of DataGridViewTextBoxCell cells.
    /// </summary>
    public class DataGridViewFilePathColumn : System.Windows.Forms.DataGridViewColumn
    {
        private bool showBrowseButton;
        [System.ComponentModel.Browsable(true)]
       // [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Always)]
        [System.ComponentModel.DefaultValue(false)]
        [System.ComponentModel.Category("Appearance")]
        [System.ComponentModel.Description("Show a button in each cell for browsing for files.")]
        public enum SelectedPathType { colorDialog, folderBrowserDialog, fontDialog, openFileDialog, saveFileDialog }
        public bool ShowBrowseButton
        {
            get { return showBrowseButton; }
            set
            {

                showBrowseButton = value;
            }
        }

        private bool useOpenFileDialogOnButtonClick;
        [System.ComponentModel.Browsable(true)]
       // [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Always)]
       // [System.ComponentModel.DefaultValue(false)]
        [System.ComponentModel.Category("Behavior")]
       // [System.ComponentModel.Description("OpenFileDialog is dispalyed and on success the contents of the Cell is replaced with the new file path.")]
        public bool UseOpenFileDialogOnButtonClick
        {

            get { return useOpenFileDialogOnButtonClick; }
            set
            {
                useOpenFileDialogOnButtonClick = value;
            }
        }
        private SelectedPathType _selected;
        [System.ComponentModel.Browsable(true)]
        //[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Always)]
        [System.ComponentModel.DefaultValue(SelectedPathType.openFileDialog)]
        [System.ComponentModel.Category("Behavior")]
        [System.ComponentModel.Description("Open File or Folder Dialog is dispalyed and on success the contents of the Cell is replaced with the new  path.")]
        public SelectedPathType SelectedMode
        {
            get {  return _selected; }
            set
            {
                _selected = value;
            }
        }
        public DataGridViewFilePathColumn()
            : base(new DataGridViewFilePathCell())
        {
        }
        public override System.Windows.Forms.DataGridViewCell CellTemplate
        {
            get
            {
                return base.CellTemplate;
            }
            set
            {
                if (null != value &&
                    !value.GetType().IsAssignableFrom(typeof(DataGridViewFilePathCell)))
                {
                    throw new InvalidCastException("must be a DataGridViewFilePathCell");
                }
                base.CellTemplate = value;
            }
        }
    }

    /// <summary>
    /// Displays editable text information in a DataGridView control. Uses
    /// PathEllipsis formatting if the column is smaller than the width of a
    /// displayed filesystem path.
    /// </summary>

    public class DataGridViewFilePathCell : DataGridViewLinkCell
    {
        Button browseButton;

        Dictionary<Color, SolidBrush> brushes = new Dictionary<Color, SolidBrush>();

        protected virtual SolidBrush GetCachedBrush(Color color)
        {
            if (this.brushes.ContainsKey(color))
                return this.brushes[color];
            SolidBrush brush = new SolidBrush(color);
            this.brushes.Add(color, brush);
            return brush;
        }

        protected virtual bool RightToLeftInternal
        {
            get
            {
                return this.DataGridView.RightToLeft == RightToLeft.Yes;
            }
        }
        protected override void OnClick(DataGridViewCellEventArgs e)
        {
            base.OnClick(e);
            if (this.DataGridView.CurrentCell == this)
            {
                string _Value = Convert.ToString(base.Value);
                DataGridViewFilePathColumn filePathColumn = (DataGridViewFilePathColumn)this.DataGridView.Columns[ColumnIndex];
                if (filePathColumn.SelectedMode == DataGridViewFilePathColumn.SelectedPathType.openFileDialog)
                {
                    if (!System.IO.File.Exists(_Value))
                    { MessageBox.Show("ไม่พบ " + _Value); }
                    else
                    { System.Diagnostics.Process.Start(_Value); }
                }
                if (filePathColumn.SelectedMode == DataGridViewFilePathColumn.SelectedPathType.folderBrowserDialog)
                {
                    if (!System.IO.Directory.Exists(_Value))
                    { MessageBox.Show("ไม่พบ " + _Value); }
                    else
                    { System.Diagnostics.Process.Start(_Value); }
                }
            }
        }
        protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            if (cellStyle == null) { throw new ArgumentNullException("cellStyle"); }
            this.PaintPrivate(graphics, clipBounds, cellBounds, rowIndex, cellState, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
        }

        protected Rectangle PaintPrivate(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            System.Diagnostics.Debug.WriteLine(string.Format("Painting Cell row {0} for rowindex {2} with rectangle {1}", this.RowIndex, cellBounds, rowIndex));
            SolidBrush cachedBrush;
            Rectangle empty = Rectangle.Empty;
            if (((paintParts & DataGridViewPaintParts.Border) != DataGridViewPaintParts.None)) { this.PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle); }
            Rectangle rectangle2 = this.BorderWidths(advancedBorderStyle);
            Rectangle borderedCellRectangle = cellBounds;
            borderedCellRectangle.Offset(rectangle2.X, rectangle2.Y);
            borderedCellRectangle.Width -= rectangle2.Right;
            borderedCellRectangle.Height -= rectangle2.Bottom;
            Point currentCellAddress = base.DataGridView.CurrentCellAddress;
            bool isFirstCell = (currentCellAddress.X == base.ColumnIndex) && (currentCellAddress.Y == rowIndex);
            bool flagisFirstCellAndNotEditing = isFirstCell && (base.DataGridView.EditingControl != null);
            bool thisCellIsSelected = (cellState & DataGridViewElementStates.Selected) != DataGridViewElementStates.None;
            cachedBrush = ((((paintParts & DataGridViewPaintParts.SelectionBackground) != DataGridViewPaintParts.None) && thisCellIsSelected) && !flagisFirstCellAndNotEditing) ? GetCachedBrush(cellStyle.SelectionBackColor) : GetCachedBrush(cellStyle.BackColor);

            if (((((paintParts & DataGridViewPaintParts.Background) != DataGridViewPaintParts.None)) && ((cachedBrush.Color.A == 0xff) && (borderedCellRectangle.Width > 0))) && (borderedCellRectangle.Height > 0))
            {
                graphics.FillRectangle(cachedBrush, borderedCellRectangle);
            }
            if (cellStyle.Padding != Padding.Empty)
            {
                if (RightToLeftInternal)
                {
                    borderedCellRectangle.Offset(cellStyle.Padding.Right, cellStyle.Padding.Top);
                }
                else
                {
                    borderedCellRectangle.Offset(cellStyle.Padding.Left, cellStyle.Padding.Top);
                }
                borderedCellRectangle.Width -= cellStyle.Padding.Horizontal;
                borderedCellRectangle.Height -= cellStyle.Padding.Vertical;
            }
            if (((isFirstCell) && (!flagisFirstCellAndNotEditing && ((paintParts & DataGridViewPaintParts.Focus) != DataGridViewPaintParts.None))) && ((ShowFocusCues && base.DataGridView.Focused) && ((borderedCellRectangle.Width > 0) && (borderedCellRectangle.Height > 0))))
            {
                ControlPaint.DrawFocusRectangle(graphics, borderedCellRectangle, Color.Empty, cachedBrush.Color);
            }
            Rectangle cellValueBounds = borderedCellRectangle;
            string text = formattedValue as string;
            if ((text != null) && (!flagisFirstCellAndNotEditing))
            {
                int y = (cellStyle.WrapMode == DataGridViewTriState.True) ? 1 : 2;
                borderedCellRectangle.Offset(0, y);
                borderedCellRectangle.Width = borderedCellRectangle.Width;
                borderedCellRectangle.Height -= y + 1;
                if ((borderedCellRectangle.Width > 0) && (borderedCellRectangle.Height > 0))
                {
                    TextFormatFlags flags = TextFormatFlags.PathEllipsis;

                    if (((paintParts & DataGridViewPaintParts.ContentForeground) != DataGridViewPaintParts.None))
                    {
                        if ((flags & TextFormatFlags.SingleLine) != TextFormatFlags.GlyphOverhangPadding) { flags |= TextFormatFlags.EndEllipsis; }
                        DataGridViewFilePathColumn filePathColumn = (DataGridViewFilePathColumn)this.DataGridView.Columns[ColumnIndex];

                        if (this.RowIndex >= 0)
                        {

                            bool changed = false;
                            if ((browseButton.Width != System.Math.Max(10, borderedCellRectangle.Width / 4)) && (browseButton.Width != 20))
                            {
                                System.Diagnostics.Trace.WriteLine(string.Format("browseButton Width was incorrect:{0} for given rectangle:{1}", browseButton.Width, borderedCellRectangle));
                                browseButton.Width = System.Math.Max(10, borderedCellRectangle.Width / 4);
                                browseButton.Width = System.Math.Min(browseButton.Width, 20);
                                changed = true;
                            }
                            if (browseButton.Height != (borderedCellRectangle.Height + 4))
                            {
                                System.Diagnostics.Trace.WriteLine(string.Format("browseButton Height was incorrect:{0} for given rectangle:{1}", browseButton.Height, borderedCellRectangle));
                                browseButton.Height = borderedCellRectangle.Height + 4;
                                changed = true;
                            }
                            Point loc = new Point();
                            loc.X = borderedCellRectangle.X + borderedCellRectangle.Width - browseButton.Width;
                            loc.Y = borderedCellRectangle.Y - 4;
                            if (browseButton.Location != loc)
                            {
                                System.Diagnostics.Trace.WriteLine(string.Format("browseButton location was incorrect:{0} for given rectangle:{1} with loc: {2}", browseButton.Location, borderedCellRectangle, loc));
                                browseButton.Location = loc;
                                changed = true;
                            }
                            if (changed)
                                browseButton.Invalidate();
                            if (!this.DataGridView.Controls.Contains(browseButton))
                                this.DataGridView.Controls.Add(browseButton);
                            borderedCellRectangle.Width -= browseButton.Width;
                        }
                    }
                    TextRenderer.DrawText(graphics, text, cellStyle.Font, borderedCellRectangle, thisCellIsSelected ? cellStyle.SelectionForeColor : cellStyle.ForeColor, flags);


                }
            }
            if ((base.DataGridView.ShowCellErrors) && ((paintParts & DataGridViewPaintParts.ErrorIcon) != DataGridViewPaintParts.None))
            {
                if ((!string.IsNullOrEmpty(errorText) && (cellValueBounds.Width >= 20)) && (cellValueBounds.Height >= 0x13))
                {
                    Rectangle iconBounds = this.GetErrorIconBounds(graphics, cellStyle, rowIndex);
                    if ((iconBounds.Width >= 4) && (iconBounds.Height >= 11))
                    {
                        iconBounds.X += cellBounds.X;
                        iconBounds.Y += cellBounds.Y;
                        Bitmap errorBitmap = new Bitmap(typeof(DataGridViewCell), "DataGridViewRow.error.bmp");
                        errorBitmap.MakeTransparent();
                        if (errorBitmap != null)
                        {
                            lock (errorBitmap)
                            {
                                graphics.DrawImage(errorBitmap, iconBounds, 0, 0, 12, 11, GraphicsUnit.Pixel);
                            }
                        }
                    }
                }

            }
            return empty;
        }

        public bool ShowFocusCues
        {
            get { return true; }
        }

        protected bool ApplyVisualStylesToHeaders
        {
            get
            {
                if (Application.RenderWithVisualStyles)
                {
                    return this.DataGridView.EnableHeadersVisualStyles;
                }
                return false;
            }
        }
        private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (base.Value.ToString().Length > 0)
            {
                System.Diagnostics.Process.Start(base.Value.ToString());
            }
        }
        void browseButton_Click(object sender, EventArgs e)
        {
            DataGridViewFilePathColumn filePathColumn = (DataGridViewFilePathColumn)this.DataGridView.Columns[ColumnIndex];
            try
            {
                if (filePathColumn.SelectedMode == DataGridViewFilePathColumn.SelectedPathType.openFileDialog)
                {
                    OpenFileDialog dialog = new OpenFileDialog();
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {

                       base.Value  = dialog.FileName.ToString();

                    }
                }
                else if (filePathColumn.SelectedMode == DataGridViewFilePathColumn.SelectedPathType.folderBrowserDialog)
                {
                    FolderBrowserDialog dialog = new FolderBrowserDialog();
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {
                        base.Value  = dialog.SelectedPath;
                    }
                }
                else if (filePathColumn.SelectedMode == DataGridViewFilePathColumn.SelectedPathType.colorDialog)
                {
                    ColorDialog dialog = new ColorDialog();
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {
                        base.Value = dialog.Color.ToString() + ":"
                                       + dialog.Color.Name.ToString()
                                      + ": A=" + dialog.Color.A + " R=" + dialog.Color.R + " G=" + dialog.Color.G + " B=" + dialog.Color.B;
                    }
                }
                else if (filePathColumn.SelectedMode == DataGridViewFilePathColumn.SelectedPathType.fontDialog)
                {
                    FontDialog dialog = new FontDialog();
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {
                        base.Value = dialog.Font.ToString();
                    }
                }
                else if (filePathColumn.SelectedMode == DataGridViewFilePathColumn.SelectedPathType.saveFileDialog)
                {
                    SaveFileDialog dialog = new SaveFileDialog();
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {
                        base.Value = dialog.FileName;
                    }
                }
            }
            catch (Exception)
            {
            }
        }
        public DataGridViewFilePathCell()
            : base()
        {
            browseButton = new Button();
            browseButton.Text = "…";
            browseButton.Click += new EventHandler(browseButton_Click);
        }
    }
    #endregion
}





Tag : .NET, Win (Windows App), C#, Windows







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2016-09-22 11:08:44 By : lamaka.tor View : 2609 Reply : 22
 

 

No. 1



โพสกระทู้ ( 821 )
บทความ ( 0 )



สถานะออฟไลน์


ลองเพิ่มตรงนี้ดูครับ
ไม่รู้ว่าตรงใจไหม

public DataGridViewFilePathColumn()
: base(new DataGridViewFilePathCell())
{
_selected = SelectedPathType.openFileDialog;
}






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-22 13:21:50 By : fonfire
 


 

No. 2



โพสกระทู้ ( 4,434 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 1 เขียนโดย : fonfire เมื่อวันที่ 2016-09-22 13:21:50
รายละเอียดของการตอบ ::
มันก็จะ เป็น openFileDialog อีกเหมือนกันครับ
ผมต้องการเลือกแบบนี้ครับ
555

แต่มันเปลี่ยนค่ากลับไปเป็น colorDialog ตลอดเลยครับ หลังจากที่รันโปรแกรม




แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-22 13:47:06 By : lamaka.tor
 

 

No. 3

Guest


+55555 (ปัญหาคือจะใส่ตรงไหนล่ะ)

Code (C#)
public override object Clone()
{
//Default return base.Clone(); 
//...
//...
/...
yourColumns cell = base.Clone() as yourColumns ;
 if (cell != null) {
    cell.yourVar = XXXXX;
 }
 return cell;
}

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-22 20:02:25 By : หน้าฮี
 


 

No. 4



โพสกระทู้ ( 4,434 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 3 เขียนโดย : หน้าฮี เมื่อวันที่ 2016-09-22 20:02:25
รายละเอียดของการตอบ ::
ผมว่าผมน่ะเข้าใจท่านผิดแน่ๆ เพราะ
ผมเอาไปใส่ใน class DataGridViewFilePathColumn

ก็ Error แบบนี้เลยครับ
Err

ใส่ใน class DataGridViewFilePathCell ก็ไม่ได้ครับ




เหมือนตัวปัญหาจะอยู่ที่ class DataGridViewFilePathColumn พอผมเปลี่ยน property ใน form
ลองรันดู มันก็จะกลับมาเป็น colorDialog ตลอดเลยครับ หลังจากที่รันโปรแกรม
เหมือนว่ามันไม่จำค่าที่เราตั้งค่าไว้ครับ

ถ้าเรา set ค่า ด้วยโค้ดใน form ก็ได้นะครับ
Code (C#)
private void Form2_Load(object sender, EventArgs e)
        { 
            this.Column1.SelectedMode = TORServices.Forms.Datagridview.DataGridViewFilePathColumn.SelectedPathType.openFileDialog;
        }


แต่ถ้ากดเลือก ใน properties ตามรูป No. 2 แบบนี้ไม่ได้ครับ


ตอนนี้เลยต้องมาเริ่มรื้อใหม่หมดตั้งแต่แรกดู
เอาไปเอามา
datagrid ที่ผมสร้างมาก็เพิ่งมารู้ว่าใส่ properties แล้วไม่ได้ซักตัวเลยครับ
ใช้ได้แต่เฉพาะที่ set แบบใช้โค้ด

กรรมของผมก็งานนี้ 555
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-22 21:09:53 By : lamaka.tor
 


 

No. 5



โพสกระทู้ ( 4,434 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook


แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-23 10:01:42 By : lamaka.tor
 


 

No. 6



โพสกระทู้ ( 4,434 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ดันๆๆๆ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-25 20:03:22 By : lamaka.tor
 


 

No. 7



โพสกระทู้ ( 242 )
บทความ ( 0 )



สถานะออฟไลน์


ลอง return ค่า SelectedPathType หรือ ลอง debug ดูว่ามันเปลี่ยนแปลงตอนไหน
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-25 22:11:19 By : bigsuntat
 


 

No. 8

Guest


จาก +55555 ข้างบน (ป่านนี้หอยเน่าไปแล้วมั้ง)

Code (C#)
public enum SelectedPathType { colorDialog, folderBrowserDialog, fontDialog, openFileDialog, saveFileDialog }
public bool ShowBrowseButton
{
    get { return showBrowseButton; }
    set
    {

        showBrowseButton = value;
    }
}
public override object Clone()
{
    var หอยงาม = base.Clone() as DataGridViewFilePathColumn ;
    if (หอยงาม != null)
    {
        หอยงาม.SelectedMode = _selected;
    }
    return หอยงาม;
}


แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-26 09:09:50 By : หน้าฮี
 


 

No. 9



โพสกระทู้ ( 4,434 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 7 เขียนโดย : bigsuntat เมื่อวันที่ 2016-09-25 22:11:19
รายละเอียดของการตอบ ::
ยังไปไม่ถึง run เลยครับ
ปิด Edit comlumn เปิดมาใหม่ก็กลายเป็น colorDialog แล้วครับ

555

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-26 09:46:56 By : lamaka.tor
 


 

No. 10



โพสกระทู้ ( 4,434 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 8 เขียนโดย : หน้าฮี เมื่อวันที่ 2016-09-26 09:09:50
รายละเอียดของการตอบ ::
ไม่ Error เหมือน No. 4 แล้วครับ
แต่ผมต้องเอา clone ไปทำไงต่อครับ
ถึงจะ set ค่าใน Edit column ได้ครับ



แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-26 09:54:38 By : lamaka.tor
 


 

No. 11

Guest


ก่อนจะไปถึงจุดนั้น "แต่ผมต้องเอา clone ไปทำไงต่อครับ"
ลองย่อปัญหาให้เล็กลง

1. สร้างโปรเจ็คใหม่ Windows Forms (รับประกันความสะอาด SourceCode ของคุณ)
2. สร้าง Class
3. ลาก DataGridView มาวางบนฟอร์ม กำหนดค่า SelectedMode
4. Clean Solution
5. Build Solution
6. Run (F5)


ข้อที่ 2.
Code (C#)
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace dgvCustomColumn //Assembly Name หรือ Root NameSpace
{
    #region _DataGridViewFilePathColumn
    /// <summary>
    /// Hosts a collection of DataGridViewTextBoxCell cells.
    /// </summary>
    public class DataGridViewFilePathColumn : System.Windows.Forms.DataGridViewColumn
    {
        private bool showBrowseButton;
        [System.ComponentModel.Browsable(true)]
        // [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Always)]
        [System.ComponentModel.DefaultValue(false)]
        [System.ComponentModel.Category("Appearance")]
        [System.ComponentModel.Description("Show a button in each cell for browsing for files.")]
        public enum SelectedPathType { colorDialog, folderBrowserDialog, fontDialog, openFileDialog, saveFileDialog }
        public bool ShowBrowseButton
        {
            get { return showBrowseButton; }
            set
            {

                showBrowseButton = value;
            }
        }
        public override object Clone()
        {
            var หอยงาม = base.Clone() as DataGridViewFilePathColumn ;
            DataGridViewFilePathColumn xxx = base.Clone() as DataGridViewFilePathColumn;
            if (หอยงาม != null)
            {
                หอยงาม.SelectedMode = _selected;
            }
            return หอยงาม;
        }
        private bool useOpenFileDialogOnButtonClick;
        [System.ComponentModel.Browsable(true)]
        // [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Always)]
        // [System.ComponentModel.DefaultValue(false)]
        [System.ComponentModel.Category("Behavior")]
        // [System.ComponentModel.Description("OpenFileDialog is dispalyed and on success the contents of the Cell is replaced with the new file path.")]
        public bool UseOpenFileDialogOnButtonClick
        {

            get { return useOpenFileDialogOnButtonClick; }
            set
            {
                useOpenFileDialogOnButtonClick = value;
            }
        }
        private SelectedPathType _selected;
        [System.ComponentModel.Browsable(true)]
        //[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Always)]
        [System.ComponentModel.DefaultValue(SelectedPathType.openFileDialog)]
        [System.ComponentModel.Category("Behavior")]
        [System.ComponentModel.Description("Open File or Folder Dialog is dispalyed and on success the contents of the Cell is replaced with the new  path.")]
        public SelectedPathType SelectedMode
        {
            get { return _selected; }
            set
            {
                _selected = value;
            }
        }
        public DataGridViewFilePathColumn()
            : base(new DataGridViewFilePathCell())
        {
        }
        public override System.Windows.Forms.DataGridViewCell CellTemplate
        {
            get
            {
                return base.CellTemplate;
            }
            set
            {
                if (null != value &&
                    !value.GetType().IsAssignableFrom(typeof(DataGridViewFilePathCell)))
                {
                    throw new InvalidCastException("must be a DataGridViewFilePathCell");
                }
                base.CellTemplate = value;
            }
        }
    }

    /// <summary>
    /// Displays editable text information in a DataGridView control. Uses
    /// PathEllipsis formatting if the column is smaller than the width of a
    /// displayed filesystem path.
    /// </summary>

    public class DataGridViewFilePathCell : DataGridViewLinkCell
    {
        Button browseButton;

        Dictionary<Color, SolidBrush> brushes = new Dictionary<Color, SolidBrush>();

        protected virtual SolidBrush GetCachedBrush(Color color)
        {
            if (this.brushes.ContainsKey(color))
                return this.brushes[color];
            SolidBrush brush = new SolidBrush(color);
            this.brushes.Add(color, brush);
            return brush;
        }

        protected virtual bool RightToLeftInternal
        {
            get
            {
                return this.DataGridView.RightToLeft == RightToLeft.Yes;
            }
        }
        protected override void OnClick(DataGridViewCellEventArgs e)
        {
            base.OnClick(e);
            if (this.DataGridView.CurrentCell == this)
            {
                string _Value = Convert.ToString(base.Value);
                DataGridViewFilePathColumn filePathColumn = (DataGridViewFilePathColumn)this.DataGridView.Columns[ColumnIndex];
                if (filePathColumn.SelectedMode == DataGridViewFilePathColumn.SelectedPathType.openFileDialog)
                {
                    if (!System.IO.File.Exists(_Value))
                    { MessageBox.Show("ไม่พบ " + _Value); }
                    else
                    { System.Diagnostics.Process.Start(_Value); }
                }
                if (filePathColumn.SelectedMode == DataGridViewFilePathColumn.SelectedPathType.folderBrowserDialog)
                {
                    if (!System.IO.Directory.Exists(_Value))
                    { MessageBox.Show("ไม่พบ " + _Value); }
                    else
                    { System.Diagnostics.Process.Start(_Value); }
                }
            }
        }
        protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            if (cellStyle == null) { throw new ArgumentNullException("cellStyle"); }
            this.PaintPrivate(graphics, clipBounds, cellBounds, rowIndex, cellState, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
        }

        protected Rectangle PaintPrivate(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            System.Diagnostics.Debug.WriteLine(string.Format("Painting Cell row {0} for rowindex {2} with rectangle {1}", this.RowIndex, cellBounds, rowIndex));
            SolidBrush cachedBrush;
            Rectangle empty = Rectangle.Empty;
            if (((paintParts & DataGridViewPaintParts.Border) != DataGridViewPaintParts.None)) { this.PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle); }
            Rectangle rectangle2 = this.BorderWidths(advancedBorderStyle);
            Rectangle borderedCellRectangle = cellBounds;
            borderedCellRectangle.Offset(rectangle2.X, rectangle2.Y);
            borderedCellRectangle.Width -= rectangle2.Right;
            borderedCellRectangle.Height -= rectangle2.Bottom;
            Point currentCellAddress = base.DataGridView.CurrentCellAddress;
            bool isFirstCell = (currentCellAddress.X == base.ColumnIndex) && (currentCellAddress.Y == rowIndex);
            bool flagisFirstCellAndNotEditing = isFirstCell && (base.DataGridView.EditingControl != null);
            bool thisCellIsSelected = (cellState & DataGridViewElementStates.Selected) != DataGridViewElementStates.None;
            cachedBrush = ((((paintParts & DataGridViewPaintParts.SelectionBackground) != DataGridViewPaintParts.None) && thisCellIsSelected) && !flagisFirstCellAndNotEditing) ? GetCachedBrush(cellStyle.SelectionBackColor) : GetCachedBrush(cellStyle.BackColor);

            if (((((paintParts & DataGridViewPaintParts.Background) != DataGridViewPaintParts.None)) && ((cachedBrush.Color.A == 0xff) && (borderedCellRectangle.Width > 0))) && (borderedCellRectangle.Height > 0))
            {
                graphics.FillRectangle(cachedBrush, borderedCellRectangle);
            }
            if (cellStyle.Padding != Padding.Empty)
            {
                if (RightToLeftInternal)
                {
                    borderedCellRectangle.Offset(cellStyle.Padding.Right, cellStyle.Padding.Top);
                }
                else
                {
                    borderedCellRectangle.Offset(cellStyle.Padding.Left, cellStyle.Padding.Top);
                }
                borderedCellRectangle.Width -= cellStyle.Padding.Horizontal;
                borderedCellRectangle.Height -= cellStyle.Padding.Vertical;
            }
            if (((isFirstCell) && (!flagisFirstCellAndNotEditing && ((paintParts & DataGridViewPaintParts.Focus) != DataGridViewPaintParts.None))) && ((ShowFocusCues && base.DataGridView.Focused) && ((borderedCellRectangle.Width > 0) && (borderedCellRectangle.Height > 0))))
            {
                ControlPaint.DrawFocusRectangle(graphics, borderedCellRectangle, Color.Empty, cachedBrush.Color);
            }
            Rectangle cellValueBounds = borderedCellRectangle;
            string text = formattedValue as string;
            if ((text != null) && (!flagisFirstCellAndNotEditing))
            {
                int y = (cellStyle.WrapMode == DataGridViewTriState.True) ? 1 : 2;
                borderedCellRectangle.Offset(0, y);
                borderedCellRectangle.Width = borderedCellRectangle.Width;
                borderedCellRectangle.Height -= y + 1;
                if ((borderedCellRectangle.Width > 0) && (borderedCellRectangle.Height > 0))
                {
                    TextFormatFlags flags = TextFormatFlags.PathEllipsis;

                    if (((paintParts & DataGridViewPaintParts.ContentForeground) != DataGridViewPaintParts.None))
                    {
                        if ((flags & TextFormatFlags.SingleLine) != TextFormatFlags.GlyphOverhangPadding) { flags |= TextFormatFlags.EndEllipsis; }
                        DataGridViewFilePathColumn filePathColumn = (DataGridViewFilePathColumn)this.DataGridView.Columns[ColumnIndex];

                        if (this.RowIndex >= 0)
                        {

                            bool changed = false;
                            if ((browseButton.Width != System.Math.Max(10, borderedCellRectangle.Width / 4)) && (browseButton.Width != 20))
                            {
                                System.Diagnostics.Trace.WriteLine(string.Format("browseButton Width was incorrect:{0} for given rectangle:{1}", browseButton.Width, borderedCellRectangle));
                                browseButton.Width = System.Math.Max(10, borderedCellRectangle.Width / 4);
                                browseButton.Width = System.Math.Min(browseButton.Width, 20);
                                changed = true;
                            }
                            if (browseButton.Height != (borderedCellRectangle.Height + 4))
                            {
                                System.Diagnostics.Trace.WriteLine(string.Format("browseButton Height was incorrect:{0} for given rectangle:{1}", browseButton.Height, borderedCellRectangle));
                                browseButton.Height = borderedCellRectangle.Height + 4;
                                changed = true;
                            }
                            Point loc = new Point();
                            loc.X = borderedCellRectangle.X + borderedCellRectangle.Width - browseButton.Width;
                            loc.Y = borderedCellRectangle.Y - 4;
                            if (browseButton.Location != loc)
                            {
                                System.Diagnostics.Trace.WriteLine(string.Format("browseButton location was incorrect:{0} for given rectangle:{1} with loc: {2}", browseButton.Location, borderedCellRectangle, loc));
                                browseButton.Location = loc;
                                changed = true;
                            }
                            if (changed)
                                browseButton.Invalidate();
                            if (!this.DataGridView.Controls.Contains(browseButton))
                                this.DataGridView.Controls.Add(browseButton);
                            borderedCellRectangle.Width -= browseButton.Width;
                        }
                    }
                    TextRenderer.DrawText(graphics, text, cellStyle.Font, borderedCellRectangle, thisCellIsSelected ? cellStyle.SelectionForeColor : cellStyle.ForeColor, flags);


                }
            }
            if ((base.DataGridView.ShowCellErrors) && ((paintParts & DataGridViewPaintParts.ErrorIcon) != DataGridViewPaintParts.None))
            {
                if ((!string.IsNullOrEmpty(errorText) && (cellValueBounds.Width >= 20)) && (cellValueBounds.Height >= 0x13))
                {
                    Rectangle iconBounds = this.GetErrorIconBounds(graphics, cellStyle, rowIndex);
                    if ((iconBounds.Width >= 4) && (iconBounds.Height >= 11))
                    {
                        iconBounds.X += cellBounds.X;
                        iconBounds.Y += cellBounds.Y;
                        Bitmap errorBitmap = new Bitmap(typeof(DataGridViewCell), "DataGridViewRow.error.bmp");
                        errorBitmap.MakeTransparent();
                        if (errorBitmap != null)
                        {
                            lock (errorBitmap)
                            {
                                graphics.DrawImage(errorBitmap, iconBounds, 0, 0, 12, 11, GraphicsUnit.Pixel);
                            }
                        }
                    }
                }

            }
            return empty;
        }

        public bool ShowFocusCues
        {
            get { return true; }
        }

        protected bool ApplyVisualStylesToHeaders
        {
            get
            {
                if (Application.RenderWithVisualStyles)
                {
                    return this.DataGridView.EnableHeadersVisualStyles;
                }
                return false;
            }
        }
        private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (base.Value.ToString().Length > 0)
            {
                System.Diagnostics.Process.Start(base.Value.ToString());
            }
        }
        void browseButton_Click(object sender, EventArgs e)
        {
            DataGridViewFilePathColumn filePathColumn = (DataGridViewFilePathColumn)this.DataGridView.Columns[ColumnIndex];
            try
            {
                if (filePathColumn.SelectedMode == DataGridViewFilePathColumn.SelectedPathType.openFileDialog)
                {
                    OpenFileDialog dialog = new OpenFileDialog();
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {

                        base.Value = dialog.FileName.ToString();

                    }
                }
                else if (filePathColumn.SelectedMode == DataGridViewFilePathColumn.SelectedPathType.folderBrowserDialog)
                {
                    FolderBrowserDialog dialog = new FolderBrowserDialog();
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {
                        base.Value = dialog.SelectedPath;
                    }
                }
                else if (filePathColumn.SelectedMode == DataGridViewFilePathColumn.SelectedPathType.colorDialog)
                {
                    ColorDialog dialog = new ColorDialog();
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {
                        base.Value = dialog.Color.ToString() + ":"
                                       + dialog.Color.Name.ToString()
                                      + ": A=" + dialog.Color.A + " R=" + dialog.Color.R + " G=" + dialog.Color.G + " B=" + dialog.Color.B;
                    }
                }
                else if (filePathColumn.SelectedMode == DataGridViewFilePathColumn.SelectedPathType.fontDialog)
                {
                    FontDialog dialog = new FontDialog();
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {
                        base.Value = dialog.Font.ToString();
                    }
                }
                else if (filePathColumn.SelectedMode == DataGridViewFilePathColumn.SelectedPathType.saveFileDialog)
                {
                    SaveFileDialog dialog = new SaveFileDialog();
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {
                        base.Value = dialog.FileName;
                    }
                }
            }
            catch (Exception)
            {
            }
        }
        public DataGridViewFilePathCell()
            : base()
        {
            browseButton = new Button();
            browseButton.Text = "…";
            browseButton.Click += new EventHandler(browseButton_Click);
        }
    }
    #endregion
}



ตัวอย่างที่สำเร็จเสมอ โดยหน้าฮี
dgvCustomColumn


ปล. ผมแค่กวาดสายตาผ่านฯ Sourcecode ผมก็รู้แล้ว
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-26 10:38:48 By : หน้าฮี
 


 

No. 12

Guest


จาก #NO11 ผมลืมบอกไปว่า ผมใช้ VS2013 Update 5 ในการทดสอบ (ใช้ทำงานจริง)
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-26 10:44:03 By : หน้าฮี
 


 

No. 13



โพสกระทู้ ( 4,434 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 11 เขียนโดย : หน้าฮี เมื่อวันที่ 2016-09-26 10:38:48
รายละเอียดของการตอบ ::

ทำไมของผมไม่หายละคร้าบ


ทั้งๆที่สร้างโปรเจคมาแล้วก๊อบไปวางแค่นั้นเองนะครับ

แต่โค้ดพี่ พอปิดแล้วไม่หายครับ
มันไปแอบหายตอนรัน

เด๋ว วิเคราะห์ ปรอท ซักตัวก่อนว่าจะลอง debug โค้ดดูอีกรอบครับ


แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-26 12:22:37 By : lamaka.tor
 


 

No. 14



โพสกระทู้ ( 4,434 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

colorDialog, folderBrowserDialog, fontDialog, saveFileDialog ได้ครับ

แต่ openFileDialog ยังกลับมาเป็น colorDialog เหมือนเดิม

ปล. เกิดความสงสัยครับ
1. ทำไมเราเพิ่มแค่ Clone() ก็ใช้ได้รึครับ
2. แบบนี้ถ้าเราจะเพิ่ม property ต่างๆลงไป หลังจากเพิ่มโค้ดใน Clone() แบบนี้ ใช้ได้
กับทุก property ทุกอย่างเลยใช่ไม๊ครับ
Code (C#)
 public override object Clone()
        {
            var clm = base.Clone() as DataGridViewFilePathColumn;
            DataGridViewFilePathColumn xxx = base.Clone() as DataGridViewFilePathColumn;
            if (clm != null)
            {
                clm.SelectedMode = _selected;
                clm.ShowBrowseButton = showBrowseButton;
            }
            return clm;
        }

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-26 13:04:24 By : lamaka.tor
 


 

No. 15

Guest


ทุกอันได้หมดยกเว้น openFileDialog ---> colorDialog

"แต่ openFileDialog ยังกลับมาเป็น colorDialog เหมือนเดิม" (ผมรู้ตั้งแต่แรกแล้วและขอปรบมือให้ +55555)

ผมดีใจนะที่คุณหาเจอ (น้อยคนนักที่จะหาเจอ อาจเป็นเพราะความพยายามไม่เพียงพอก็อาจเป็นไปได้)
--- หมดหน้าที่ของผมแล้ว ที่เหลือก็เป็นหน้าที่ของคุณ (ค่อยฯคิด/สังเกตุ)
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-26 18:21:31 By : หน้าฮี
 


 

No. 16

Guest


แถม

Code (C#)
[private SelectedPathType _selected = SelectedPathType.openFileDialog;
[System.ComponentModel.Browsable(true)]
//[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Always)]
[System.ComponentModel.DefaultValue(true)]
//[System.ComponentModel.DefaultValue(SelectedPathType.openFileDialog)]
[System.ComponentModel.Category("Behavior")]
[System.ComponentModel.Description("Open File or Folder Dialog is dispalyed and on success the contents of the Cell is replaced with the new  path.")]
public SelectedPathType SelectedMode
{
    get { return _selected; }
    set
    {
        _selected = value;
    }
}
/cs]

ถ้าเป็น C# 6.0 แบบนี้จบ (Auto SexProperty Value)
Code (C#)
[cs]private string _selectedSEX { get; set; } = SelectedPathType.openFileDialog;



ขอให้โชคดี

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-26 18:59:19 By : หน้าฮี
 


 

No. 17

Guest


จาก #NO 14 ข้อสงสัยบางประการที่มีประโยชน์สำหรับตัวเจ้าของกระทู้เองและผู้ที่ผ่านไปผ่านมา
Quote:
ปล. เกิดความสงสัยครับ
1. ทำไมเราเพิ่มแค่ Clone() ก็ใช้ได้รึครับ
2. แบบนี้ถ้าเราจะเพิ่ม property ต่างๆลงไป หลังจากเพิ่มโค้ดใน Clone() แบบนี้ ใช้ได้
กับทุก property ทุกอย่างเลยใช่ไม๊ครับ


ข้อสงสัยของคุณทำให้ผมหวลคิดถึงอดีตกาลที่สวยงาม บนกระดานถามตอบบนอินเตอร์เน็ต
--- ยุคสมัยนั้น ทุกฯข้อสงสัยเหล่านี้จะมีคนมาอธิบายที่มาและที่ไป (จะพูดว่าอยู่ในอ้อมกอดของความอบอุ่นก็คงจะไม่เกินไปนัก)
--- ก่อน.../FoxBASE/FoxPro ประมาณนั้น (พ่อแม่ของคนบางคน/บางคำถาม ยังไม่เกิดมั้ง +55555)
--- ยุคสมัยนี้ มันยุคฉาบฉวย
------ ใครเดินอยู่ข้างหน้าสุดของคนอื่น สังคมจะรับรู้ว่าเขาคือ "คนดี"
------ ใครเดินอยู่ข้างหน้าสุดของคนอื่น สังคมจะรับรู้ว่าเขาคือ "ไม่น่าจะใช่คนดี" (ตรรกะวิปะลาด)

...
...
...

ปล. นับวันความลุ่มลึกในเชิงโปรแกรมมิ่งในอ้อมกอดของความอบอุ่น มันลดลงไปเรื่อยฯ (ลดน้อยถอยลง ตามจิตใจของคน...)
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-26 20:13:38 By : หน้าฮี
 


 

No. 18

Guest


จาก #NO17 สมมุติว่าผมหนาวผมก็กลับไปหาความอบอุ่นทางใจ (สถานที่บำบัดรักษา อาการสมอง/หัวใจ ของผม)
กระผมขออนุญาติยกมาโดยพละการ (เห็นว่ามีประโยชน์ สำหรับมวลมนุษยชาติ)

Quote:
วันนี้ตอนเช้าผมต้องไปเดินออกกำลังกาย และตอนเช้าก็กินสลัดผัก ช่วงนี้จะเน้นไปที่มังสะวิรัต เนื่องจากได้ขัอมูลดีจากหมอ

ได้ข้อมูลทางinternet หมอสันต์แนะนำตัวเอง ในโอกาสที่มีผู้อ่านครบ 4 ล้านครั้ง

สวัสดีครับ

ผม สันต์ ใจยอดศิลป์ นะครับ จะอยู่ด้วยกันกับท่านตลอดการฝึกอบรมนี้สามวัน เรียกว่าจะเป็นวิทยากรหลักให้ท่าน เป้าหมายที่เรามาพบกันที่นี่ก็คือแบงค์อยากจะให้ท่านมีชีวิตในวัยเกษียณที่มีคุณภาพและมีสุขภาพดี แต่การจะมีสุขภาพดี ก็คือการเอาชนะนิสัยเดิมๆที่ไม่ดีของเราเอง ซึ่งเป็นอะไรที่แบงค์ตามไปเนรมิตให้ทุกท่านไม่ได้ แต่ก็พยายามทำเท่าที่แบงค์จะทำให้ได้ คือติดอาวุธอันเป็นความรู้และทักษะในการดูแลตนเองให้ท่านก่อนเกษียณ แล้วที่เหลือท่านก็เอาอาวุธนี้ไปออกรบเอาเอง


เมื่อตะกี้เจอกันนอกห้อง มีท่านหนึ่งทักผมว่าถ้าดิฉันโชคดีมีสุขภาพดีอย่างคุณหมอก็คงจะดี ซึ่งผมยังไม่ทันได้ตอบเพราะเจอกันแป๊บเดียว ขอตอบตอนนี้เสียเลย ว่าผมเองตอนตั้งต้นก่อนเกษียณก็ไม่ได้มีสุขภาพดีนะครับ จริงๆแล้วตอนก่อนเกษียณผมก็เป็นคนป่วยหลายโรคเหมือนหลายๆท่านในห้องนี้เนี่ยแหละ

ผมจะเล่าที่มาที่ไปให้ฟังนะครับ คือตัวผมนี้ความจริงเป็นหมอหัวใจ หรือพูดให้ชัดกว่านั้นอีกหน่อยก็คือเป็นหมอผ่าตัดหัวใจ ความชำนาญของผมก็คือผ่าตัดแก้ไขหลอดเลือดหัวใจตีบหรือที่เรียกว่าผ่าตัดบายพาส การใช้ชีวิตในวัยทำงานของผมก็ค่อนข้างใช้แบบสำบุกสำบันเหมือนกับหลายท่านในนี้ซึ่งผ่านวันเวลาแบบนั้นมาหมาดๆ คือทำงานมาก มากเกินไป และไม่ได้สนใจที่จะฟูมฟักดูแลร่างกายมากนัก เพราะมันก็ดีๆของมันอยู่ การผ่าตัดหัวใจเป็นงานที่มักจะต่อเนื่อง พูดง่ายๆว่าติดลม บางวันกว่าจะเสร็จก็สามสี่ทุ่ม กลับถึงบ้านก็ใกล้เที่ยงคืนไปแล้ว ลูกเมียเขาหลับกันหมดแล้ว ผมต้องไปค้นตู้เย็นหาอะไรกิน เมียเขาจะจัดอาหารโปรดของผมไว้ คือเค้กซาราลี บัทเทอร์เค้ก นั่นแหละของชอบ ผมกินมันทุกคืน แล้วผมเนี่ยสมัยที่ทำงานอยู่ไม่ดื่มน้ำเปล่านะครับ ดื่มโค้กแทนน้ำเปล่า วันหนึ่งก็หนึ่งลิตรขึ้นไป เพราะดื่มน้ำเปล่ามันไม่สะใจ แล้วเราก็มีเงินซื้อ ใครจะทำไม ในที่ทำงานผมดื่มกาแฟวันละหลายแก้วเพราะทำงานบริหารด้วย เวลานั่งประชุมฟังลูกน้องพูดเพ้อเจ้อผมก็จิบกาแฟไป วิธีชงกาแฟของผมก็เป็นมาตรฐานไทยแลนด์ คือ ทรี-อิน-วัน หมายความว่าน้ำตาล ครีมเทียม กาแฟ ผสมกันมาเสร็จเรียบร้อยในซองเดียว ใช้ชีวิตแบบนี้เรื่อยมา จนถึงวันที่เริ่มป่วย

ตอนนั้นผมอายุห้าสิบปลายๆแล้ว มันเริ่มด้วยอาการเวลาทำงานมากๆแล้วแน่นๆหน้าอกไม่สบาย จิตใจก็ค่อนข้างหงุดหงิดงุ่นง่านจนลูกน้องเข้าหน้าไม่ติด ตอนนั้นทำสองจ๊อบ คือเป็นหมอผ่าตัดหัวใจด้วย เป็นผู้อำนวยการโรงพยาบาลด้วย วันหนึ่งตอนเลิกงานประมาณเกือบสามทุ่ม เลขาหน้าห้องมาดักรอผมอยู่ที่ประตู แล้วรวบรวมความกล้าบอกผมว่า

“อาจารย์รู้ตัวหรือเปล่าคะ ว่าอาจารย์นะ...หงุดหงิด”

พอเจอจิ้งจกทัก ผมก็มานั่งมองตัวเอง เออ..สงสัยเราจะป่วยจริงๆแฮะ จึงหยุดงานไปให้หมอรุ่นน้องตรวจประเมินสุขภาพอย่างจริงจัง โดยธรรมชาติของหมอจะเหมือนกันทั้งหมอไทยและหมอฝรั่ง คือไม่เคยทำการตรวจสุขภาพประจำปีอย่างเป็นเรื่องเป็นราว เพราะถือว่าตัวเองเป็นหมอดูแลตัวเองอยู่ทุกวันอยู่แล้ว เมื่อผมตัดสินใจไปตรวจสุขภาพประจำปี ก็ได้มาหลายโรค อย่างแรกก็คือความดันเลือดสูงถึงขั้นต้องใช้ยา อย่างที่สองก็คือไขมันในเลือดสูงถึงขั้นต้องใช้ยา อย่างที่สามก็คือเป็นโรคหลอดเลือดหัวใจตีบ ซึ่งทราบได้จากการใช้เครื่องคอมพิวเตอร์ตรวจดูแคลเซียมที่หลอดเลือดหัวใจ อย่างที่สี่ก็คือลงพุง คือน้ำหนักเกิน และส่วนใหญ่มาอยู่ที่พุง ไม่อ้วน แต่หุ่นเป็นแบบไอ้เท่งหนังตะลุง คือหลังค่อมพุงแอ่น นั่นคือตัวผมเมื่ออายุราว 56 ปี หมอรุ่นน้องซึ่งเป็นหมออายุรกรรมหัวใจก็ให้ยามาหลายตัว หนึ่งโรคก็หนึ่งตัว แถมอีกตัวหนึ่งคือยากล่อมประสาท แสดงว่าหมอเขาคิดว่าผมเป็นโรค ปสด. ด้วย

ผมกินยาตามหมอสั่งได้สองเดือนโดยใช้ชีวิตแบบเดิม ทำงานเหมือนเดิม อาการทั้งด้านร่างกายและจิตใจไม่มีอะไรดีขึ้น แถมมีอาการซึมกะทือจากยากล่อมประสาทอีกด้วย จิตใจก็แย่ การเป็นคนป่วยนั่นก็แย่ระดับหนึ่งแล้ว ยังมีความเบื่องานบวกเข้าไปอีก ทั้งๆที่เป็นเจ้านายเขาแต่มันก็เบื่อ มองอนาคตตัวเองด้วยความกังวล ว่าวันนี้เราเป็นความดันสูง ไขมันสูง หลอดเลือดหัวใจตีบ กินยาหนึ่งกำมือ สิ่งที่รออยู่ข้างหน้าคืออะไรผมมองออกหมดแล้ว ถึงจุดหนึ่งก็ต้องไปทำบอลลูน ทำไปสักสองสามครั้งแล้วก็ต้องไปผ่าตัดบายพาส อย่างที่ผมทำให้คนไข้ทุกเมื่อเชื่อวันนั่นแหละ ทำแล้วบ้างก็ดีขึ้น บ้างก็ไม่ดีขึ้น บ้างก็ตาย เพียงแต่คราวนี้จะเปลี่ยนเป็นตัวผมนอนอยู่บนเขียง ให้หมอรุ่นน้องคนอื่นเป็นคนผ่าตัดให้

ในช่วงที่ผ่าตัดอยู่ วันไหนอารมณ์ดีๆผมจะบอกหมอที่เป็นลูกศิษย์ว่าคุณรู้ไหม วันหนึ่งข้างหน้าคนรุ่นหลานของเราจะเล่าสู่กันฟังด้วยความตลกขบขันว่าสมัยคุณปู่เนี่ย คนเราทำไมโง่จังนะ แค่ไขมันอุดหลอดเลือดหัวใจ หมอสมัยนั้นต้องเอาคนไข้มาผ่าแบะหน้าอกออกเพื่อทำบายพาสหลอดเลือด คือผมพูดอย่างนี้กับลูกน้องเพื่อจะย้ำให้เขาเห็นว่าการผ่าตัดบายพาสเป็นการรักษาแบบเกาไม่ถูกที่คัน แต่เราก็ไม่มีวิธีอื่นที่ดีกว่านี้ อย่างน้อยตอนนี้ยังไม่มี เพื่อให้เขาซึ่งเป็นคนรุ่นใหม่ขยันค้นคว้าวิจัยหาวิธีรักษาที่ดีกว่านี้ แต่ว่ามาถึงตอนนี้ผมเป็นคนป่วยแล้ว และวันหนึ่งผมจะต้องมารับการรักษาด้วยวิธีซึ่งผมรู้อยู่แก่ใจอยู่แล้วว่า “ไม่ใช่” ผมจะทำอย่างไรดี มีวิธีอื่นอีกไหมที่จะดูแลตัวเองโดยไม่ต้องผ่าตัด คิดไปคิดมาแล้วคำตอบก็มีอยู่คำเดียว คือ...

“ไม่ทราบ”

ณ ตอนนั้นผมเรียนจบแพทย์มาได้สามสิบปีแล้ว ผ่านการเป็นแพทย์ทั่วไป แล้วไปฝึกอบรมเป็นศัลยแพทย์ทั่วไป ทำงานพักหนึ่งแล้วไปฝึกอบรมเป็นศัลยแพทย์ทรวงอก ทำงานพักหนึ่งแล้วไปฝึกอบรมต่างประเทศเป็นศัลยแพทย์หัวใจ ทำงานพักหนึ่งแล้วก็ค่อยๆจำกัดชนิดการผ่าตัดลงจนแทบจะเหลือแต่การผ่าตัดบายพาส คือมุดรูเล็กลงๆเรื่อยๆ เหลือความรู้อยู่แต่เรื่องที่ตนเองเชี่ยวชาญอยู่นิดเดียว สามสิบปีที่ผ่านไป มีความรู้อะไรใหม่ๆเกิดขึ้นในวิชาแพทย์บ้าง ผมไม่ได้ติดตามเลย ผมตัดสินใจถอยกลับมาเรียนวิชาแพทย์ใหม่ด้วยตนเอง ทั้งๆที่ยังทำงานอยู่นั่นแหละ ผมทำในสิ่งที่นักวิชาการเขาเรียกว่า “การทบทวนวรรณกรรม (literature review)“ คือถอยไปตั้งต้นย้อนยุคเมื่อผมจบแพทย์ใหม่ๆ แล้วไล่มาทีละปีพ.ศ.ว่านับตั้งแต่นั้นมามีงานวิจัยทางการแพทย์อะไรใหม่ๆเกิดขึ้นโดยที่ผมไม่ทราบบ้าง

ผมได้พบว่ามีงานวิจัยการรักษาโรคหัวใจที่ให้ผลเหลือเชื่อเกิดขึ้นจำนวนมาก ซึ่งผมไม่เคยรู้มาก่อนเลย ทั้งๆที่ผมเองก็เป็นหมอหัวใจ ผมจะยกตัวอย่างงานวิจัยบางงานที่เตะตาผมจังๆให้ท่านทราบนะ

งานวิจัยนี้ชื่อ EUROASPIRE เป็นงานวิจัยขนาดใหญ่ ใช้คนไข้โรคหัวใจถึง 13,935 คน ทำในโรงพยาบาลชั้นดีในยุโรป 67 รพ. ใน 22 ประเทศ และมีระยะติดตามดูนานถึง 12 ปี คือเขาติดตามดูคนไข้โรคหัวใจขาดเลือดที่ได้รับการรักษาตามวิธีมาตรฐานปัจจุบัน กล่าวคือกินยา บอลลูน บายพาส คือจะดูว่าถ้าเป็นคนไข้ที่ดี หมอบอกให้กินยาก็กิน และรักษาอยู่กับโรงพยาบาลที่ดี หมอดี เครื่องมือดี ดูซิว่าผ่านไป 12 ปี แล้วคนไข้จะมีอะไรดีขึ้นบ้างไหม ผลวิจัยที่ได้ก็คือ ไม่มีอะไรดีขึ้นเลย อย่างเรื่องความอ้วน ยิ่งรักษากันไปก็ยิ่งอ้วนเผละยิ่งขึ้น ผ่านไปสี่ปีคนอ้วนเพิ่มขึ้น 25% ผ่านไปแปดปี เพิ่มขึ้นอีก 33%ผ่านไปสิบสองปี เพิ่มขึ้นเป็น 38%

มาดูความดันเลือดบ้าง ผ่านไปสี่ปีคนเป็นความดันเลือดสูงเพิ่มขึ้น 32% ผ่านไปแปดปีเพิ่มเป็น43% ผ่านไปสิบสองปีเพิ่มเป็น 56% เรียกว่ารักษาไปรักษามากลายเป็นความดันเลือดสูงซะมากกว่าครึ่ง มาดูการเป็นเบาหวานก็ได้ ผ่านไปสี่ปีเป็นเบาหวาน 17% ผ่านไปแปดปีเพิ่มเป็น 20% ผ่านไปสิบสองปีเพิ่มเป็น 28% คือการแพทย์แผนปัจจุบันนี้รักษาคนไข้โรคหัวใจยิ่งทำกันไปก็ยิ่งสาละวันเตี้ยลงพูดเป็นภาษาจิ๊กโก๋ก็คือ

“..วิธีการรักษาโรคหัวใจของการแพทย์แผนปัจจุบันที่ทำกันอยู่นี้มัน..ไม่เวอร์ค”

คราวนี้มาดูงานวิจัยนี้นะ หมอคนนี้ชื่อ Caldwell Esselstyn เขาเป็นหมอทางด้านผ่าตัดต่อมไร้ท่อ เขาได้ทำงานวิจัยโดยเอาคนไข้โรคหัวใจของเขามา 22 คน จับทุกคนสวนหัวใจ ฉีดสี ถ่ายรูปไว้หมด ว่าคนไหน หลอดหัวใจตีบที่หลอดเลือดเส้นไหน ตีบมากตีบน้อยแค่ไหน แล้วถ่ายรูปไว้ แล้วให้คนไข้เหล่านี้กินแต่อาหารมังสะวิรัต กินอยู่นาน 5 ปี แล้วเอาคนไข้ทั้งหมดกลับมาสวนหัวใจฉีดสีถ่ายรูปใหม่ แล้วเอารูปครั้งแรกและครั้งที่สองมาเปรียบเทียบกัน ก็พบว่าหลอดเลือดหัวใจตีบของคนไข้เหล่านี้กลายเป็นโล่งขึ้น อย่างตัวอย่างคนไข้คนนี้ ก่อนเริ่มวิจัย ผลฉีดสีเป็นอย่างนี้ คือเวลาเราฉีดสีเข้าไปในหลอดเลือดแล้วถ่ายเอ็กซเรย์ออกมาเป็นภาพยนตร์ ตัวสีจะเห็นเป็นสีขาวอย่างนี้ เวลาที่สีวิ่งผ่านจุดที่หลอดเลือดหัวใจมันตีบแคบหรือขรุขระ เนื้อสีสีขาวมันก็จะถูกบีบให้แคบและเห็นขอบขรุขระด้วยอย่างนี้ ส่วนภาพนี้เป็นผลการฉีดสีหลังจากกินมังสะวิรัติไปแล้วห้าปี จะเห็นว่ารอยตีบรอยขรุขระที่หลอดเลือดหายไป เหลือแต่ลำสีที่วิ่งได้เต็มหลอดเลือดตามปกติ

นี่เป็นหลักฐานวิทยาศาสตร์ชิ้นแรกที่ยืนยันว่าโรคหลอดเลือดหัวใจตีบที่เราเชื่อกันมาแต่เดิมว่าเป็นแล้วไม่มีทางหายนั้นไม่เป็นความจริง ผลการติดตามฉีดสีซ้ำนี้ยืนยันว่ามันหายได้ และในงานวิจัยของเอสเซลส์ทินนี้ ปัจจัยหนึ่งที่ช่วยให้มันหายคือการปรับอาหารการกิน

ผมเห็นงานวิจัยนี้ครั้งแรกผมทึ่งมาก ทั้งๆที่เขาทำไว้ตั้งสิบกว่าปีมาแล้ว แต่ผมเองเป็นหมอหัวใจผมกลับไม่ทราบเลย เห็นอย่างนี้ผมเชื่อแล้วว่าโรคหลอดเลือดหัวใจมันหายได้ แต่ผมยังมีข้อกริ่งเกรงอยู่ประเด็นหนึ่ง คือตัวผมเองก็เป็นนักวิจัย งานวิจัยที่ไม่ได้สุ่มกลุ่มตัวอย่างออกเป็นสองกลุ่มไว้เปรียบเทียบกันนั้น จะสรุปเอาดื้อๆว่าหลอดเลือดตีบหายเพราะปรับอาหารย่อมไม่ได้ มันต้องมีงานวิจัยแบบเดียวกันที่เอาคนไข้มาสุ่มตัวอย่างเป็นสองกลุ่มแล้วเปรียบเทียบกันดู จึงจะพิสูจน์ได้จะจะว่ามันหายเพราะปรับอาหารจริงหรือไม่

แล้วผมไม่ต้องรอนานเลย หมอคนนี้ชื่อ Dean Ornish เขาเป็นหมอหัวใจ เขาได้ทำงานวิจัยที่เอาไข้โรคหัวมาเกือบร้อยคนจับฉลากแบ่งออกเป็นสองกลุ่ม ใครจับได้เบอร์ดำ ไปเข้ากลุ่มควบคุมซึ่งไม่ต้องทำอะไรนอกจากใช้ชีวิตแบบที่เคยทำมาตามปกติ ใครจับได้เบอร์แดงไปเข้ากลุ่มที่ต้องปรับชีวิต คือต้องทำสามอย่าง ได้แก่ (1) ต้องกินอาหารมังสะวิรัติไขมันต่ำ (2) ต้องออกกำลังกายสัปดาห์ละ 5 ครั้ง (3) ต้องจัดการความเครียดด้วยการทำสมาธิตามดูลมหายใจ หรือรำมวยจีน หรือโยคะ อย่างใดอย่างหนึ่ง ทุกวัน ก่อนเริ่มวิจัยก็เอาทุกคนทั้งสองกลุ่มมาสวนหัวใจฉีดสีถ่ายรูปหลอดเลือดไว้ก่อน พอครบหนึ่งปีก็เอามาสวนหัวใจฉีดสีถ่ายรูปอีก พอครบห้าปีก็เอาทุกคนมาสวนหัวใจฉีดสีถ่ายรูปอีก ผลวิจัยที่ได้ยืนยันงานวิจัยของเอสเซลส์ทีน คือ กลุ่มที่ปรับชีวิตรอยตีบที่หัวใจโล่งขึ้น ขณะที่กลุ่มที่อยู่เฉยๆรอบตีบเดินหน้าตีบแคบลง ผลการสวนหัวใจเมื่อห้าปีก็ยิ่งยืนยันว่ากลุ่มที่ปรับชีวิตรอยตีบก็ยิ่งโล่งขึ้นอีก กลุ่มที่อยู่เฉยๆรอยตีบก็ยิ่งตีบแคบลงอีก ต้องเจ็บหน้าอกบ่อยกว่า เข้าโรงพยาบาลบ่อยกว่า

มาถึงตรงนี้โรคหลอดเลือดหัวใจนั้นชัดแล้วว่ามันหายได้ด้วยการกินอาหารที่มีพืชเป็นหลักและมีไขมันต่ำ ออกกำลังกาย และจัดการความเครียด แล้วความดันเลือดสูงละ ผมได้ค้นคว้าต่อไปอีก ก็พบว่ามีงานวิจัยการลดความดันเลือดโดยไม่ใช้ยาทำไว้เป็นจำนวนมาก เรียกว่าเป็นหลักฐานที่ชัดเจน ผมสรุปมาให้ดูตรงนี้คือถ้าลดน้ำหนักได้ 10 กก. ความดันตัวบนจะลดลง 20 มิล ถ้ากินอาหารมังสะวิรัติบวกนมไร้ไขมันบวกปลาความดันตัวบนจะลดลง 14 มิล ถ้าออกกำลังกาย ความดันตัวบนจะลดลง 9มิล ถ้าเลิกกินเค็ม ความดันตัวบนจะลดลง 8 มิล ถ้าบวกสี่อย่างนี้เข้าด้วยกันความดันตัวบนก็จะลดลงได้มากโดยที่ไม่ต้องใช้ยาเลย

คราวนี้โดยบังเอิญ ผมก็ไปพบงานวิจัยปรับชีวิตเพื่อรักษาเบาหวานเข้า งานวิจัยนี้เรียกว่างานวิจัย DPPRG เขาเอาคนที่มีน้ำตาลในเลือดสูงกว่า 100 มา 3234 คน มาจับฉลากแบ่งเป็นสามกลุ่ม กลุ่มที่ 1. ให้ปรับชีวิตในสามประเด็นคืออาหาร ออกกำลังกาย และจัดการความเครียด กลุ่มที่ 2. ให้กินยาเบาหวานซะเลยรู้แล้วรู้รอด กลุ่มที่ 3. ไม่ต้องทำอะไร ใช้ชีวิตไปตามปกติของตน แล้วตามดูคนพวกนี้ไปสี่ปี ดูว่าใครจะป่วยเป็นโรคเบาหวานมากกว่ากัน ผลเป็นอย่างนี้ครับ

กลุ่มที่ไม่ทำอะไรเลยเป็นเบาหวานมากที่สุด กลุ่มที่กินยาเบาหวานเป็นเบาหวานรองลงมา ส่วนกลุ่มที่ปรับชีวิตเป็นเบาหวานน้อยที่สุด น้อยกว่ากลุ่มแรกเกินสองเท่าตัว

ผมศึกษางานวิจัยถึงการปรับอาหารเพื่อลดไขมันในเลือดและลดการเป็นโรค เริ่มต้นผมก็มาสะดุดที่งานวิจัยขนาดใหญ่ของฮาร์วาร์ดอันนี้ ในงานวิจัยนี้ ฮาร์วาร์ดตามดูคนแปดหมื่นกว่าคนนาน 12ปี เพื่อจะดูว่าการกินไขมันแบบไหนทำให้ป่วยและตายจากโรคหลอดเลือดหัวใจมากที่สุด โดยใช้แคลอรี่ที่เท่ากันเป็นตัวเทียบ และเอาแคลอรี่จากอาหารคาร์โบไฮเดรตเป็นเกณฑ์มาตรฐาน พูดง่ายๆว่าเป็นงานวิจัยเทียบระดับความชั่วร้ายของไขมันชนิดต่างๆ ก่อนหน้านี้ผมมีความเข้าใจว่าน้ำมันหมู น้ำมันวัว หรือที่เรียกกันว่าไขมันอิ่มตัวนั้น เป็นไขมันที่ชั่วร้ายที่สุด แต่พอมาศึกษางานวิจัยนี้จึงรู้ว่าเข้าใจชีวิตผิดไปแล้ว

ผลของงานวิจัยนี้ ไขมันที่ชั่วร้ายที่สุดคือไขมันทรานส์ ทำให้ป่วยและตายมากกว่าคาร์โบไฮเดรตถึง 93% ชั่วร้ายกว่าน้ำมันหมูน้ำมันวัวที่ทำให้ป่วยและตายมากกว่าคาร์โบไฮเดรตสิบกว่าเปอร์เซ็นต์เท่านั้น คือสรุปว่าไขมันทรานส์นี้ชั่วร้ายกว่าน้ำมันหมูหลายเท่า

ตอนนั้นผมไม่รู้เลยว่าไขมันทรานส์นี่มันอะไรกันวะ เมื่อศึกษาเพิ่มเติมจึงได้ทราบว่าไขมันทรานส์นี้แต่ก่อนมันมีในอาหารของมนุษย์เราน้อยมาก เพราะมันไม่มีอยู่ในธรรมชาติ แต่เมื่อยี่สิบปีก่อนคนเราเกิดความกลัวน้ำมันหมูน้ำมันวัวแบบ*****ขึ้นสมอง คนก็หันไปหาน้ำมันพืชซึ่งเป็นไขมันไม่อิ่มตัว เช่นน้ำมันถั่วเหลือง แต่ว่าน้ำมันไม่อิ่มตัวนี้มันเอามาทำอาหารอุตสาหกรรมไม่ได้ เพราะมันเหลวเละ อัดเป็นก้อนไม่ได้ ทำให้เป็นผงก็ไม่ได้ นักอุตสาหกรรมจึงเอาน้ำมันพืชมา แล้วใส่ไฮโดรเจนเข้าไปเพื่อให้โมเลกุลของมันมีความเสถียร ทำเป็นก้อนได้ ทำเป็นผงได้ น้ำมันที่ได้จากการใส่ไฮโดรเจนนี้เรียกว่าไขมันทรานส์ มันทำมาจากน้ำมันถั่วเหลืองก็จริง แต่มันกลายเป็นน้ำมันอีกอย่างไปแล้ว คุณสมบัติมันเปลี่ยนไปแล้ว เหมือนคนเคยเป็นเสื้อเหลืองตอนนี้เปลี่ยนเป็นเสื้อแดง มันคนละเรื่องแล้ว แต่เมื่อสิบกว่าปีก่อนวงการแพทย์ยังไม่รู้ เราก็เอาไขมันทรานส์มาทำอาหารอุตสาหกรรมเช่นเนยเทียม ครีมเทียมใส่กาแฟ และเอามาทำ เค้ก คุ้กกี้ ขนมกรุบกรอบต่างๆ เหล่านี้แหละคือไขมันทรานส์

ผมถึงบางอ้อเลย เพราะผมดื่มกาแฟ “ทรีอินวัน” ใส่ครีมเทียมและน้ำตาลก้อนวันละหลายแก้ว มีคุ้กกี้ควบกับกาแฟเสมอ แถมกลับบ้านโซ้ยเค้กซาราลีเป็นมื้อเย็นอีก เรียกว่าผมเป็นแฟนพันธุ์แท้ของไขมันทรานส์ ไขมันที่ชั่วร้ายที่สุดมาซะนานนะเนี่ย อุตส่าห์เลิกแคบหมูของโปรดนึกว่าจะได้ดี..ที่ไหนได้

ยังมีอีกประเด็นหนึ่ง คือผมทบทวนงานวิจัยวิทยาศาสตร์พื้นฐาน จนผมสรุปข้อมูลได้แน่ชัดว่าอาหารให้พลังงานทุกชนิดรวมทั้งคาร์โบไฮเดรตเช่นข้าว เส้นก๋วยเตี๋ยว แป้ง น้ำตาล หากคาร์โบไฮเดรตมันเหลือใช้ ร่างกายจะเปลี่ยนมันเป็นไขมันเก็บไว้ และทำให้ระดับไขมันเลวในร่างกายเพิ่มขึ้น และเมื่อผมตามไปดูงานวิจัยที่มาของคาร์โบไฮเดรตในอาหารของคนอเมริกัน ก็พบว่า 35% มาจากเครื่องดื่มที่ใส่น้ำตาลเช่นน้ำอัดลมต่างๆ อ้าว..เอาอีกแล้วผม เพราะผมดื่มโค้กแทนน้ำเปล่า ผมรับมาเต็มๆอีกแล้ว

มาถึงจุดนี้ เห็นงานวิจัยพวกนี้ ผมสรุปได้แล้วว่าทางไปอยู่ที่ไหน ทางไปคือต้องปรับชีวิตในสามประเด็น คืออาหาร ออกกำลังกาย และจัดการความเครียด ผมตัดสินใจเลย...ต้องเดินหน้าทดลองกับตัวเอง

ผมโยนยาที่หมอให้มาทิ้งหมด เอาแบบพระเจ้าตากทุบหม้อข้าวก่อนเข้าตีเมืองจันทร์

เอาเรื่องอาหารก่อน เริ่มด้วยการเปลี่ยนโค้กเป็นโค้กซีโร่ ปรากฏว่าไม่ได้ผล เพราะมันบ่แซ่บ เมื่อลิ้นมันเรื่องมากผมจึงตัดบทเปลี่ยนจากโค้กซีโร่มาเป็นน้ำเปล่าซะเลยให้รู้แล้วรู้รอด เพราะไหนๆมันก็จืดแล้วก็เอาให้จืดสุดๆไปเลย

ทีนี้ก็มาถึงเค้ก ผมติดเค้ก อย่างที่เล่าให้ฟังแล้ว วิธีแก้ของผมง่ายมาก คือผมออกกฎหมายห้ามนำเค้กเข้าบ้าน ลูกเมียพาลอดกินเค้กกันหมด ได้ผลปึ๊ด..ดเลย

ก็เหลือเรื่องเดียว คือต้องทานผักผลไม้ให้มากขึ้น ตามมาตรฐานที่แนะนำโดย USDA คือต้องทานให้ได้ถึงวันละ 5 เสริฟวิ่ง หนึ่งเสริฟวิ่งนิยามว่าเท่ากับผักสดหนึ่งจาน หรือผลไม้ลูกเขื่องๆเช่นแอปเปิ้ลหนึ่งลูก วันหนึ่งต้องได้ 5 เสริฟวิ่ง โอ้โฮ จะเอาเวลาที่ไหนมาเคี้ยวกันละครับ เพราะทุกวันนี้แค่อาหารตามมื้อปกติยังจะไม่มีเวลาเคี้ยวเลย แต่ก็พอดีช่วงนั้นมีเครื่องปั่นอาหารด้วยความเร็วสูงเข้ามาขายในบ้านเรา คือความเร็วสูงถึงสามหมื่นรอบต่อนาที ขณะที่เครื่องปั่นอาหารทั่วไปความเร็วอย่างมากก็แค่สามพันรอบต่อนาที ด้วยรอบที่สูงขนาดนี้ ทำให้สามารถปั่นส่วนของผลไม้แข็งๆเช่นเม็ดในขององุ่นหรือฝรั่งให้กลายเป็นของเหลวที่ดื่มได้เลย เขาเอามาปั่นผลไม้ที่แช่แข็งแล้วให้กลายเป็นน้ำแข็งฝอยคล้ายไอศครีมซึ่งเรียกกันทั่วไปว่าเชอร์แบท ก่อนหน้านั้นผมเองเคยได้อ่านหมออเมริกันคนหนึ่งเขียนถึงการรักษาคนสูงอายุที่ฟันไม่ดีและเป็นโรคขาดวิตามินด้วยวิธีการปั่นผักและผลไม้จนเหลวเป็นน้ำให้ดื่มจะได้ไม่ต้องเคี้ยว ผมจึงบอกภรรยาซื้อเครื่องปั่นแบบนี้มาลองดู ตื่นเช้าก็เอาผลไม้และผักอะไรก็ได้ที่เหลือจากห้องครัวโยนใส่โถแล้วปั่นให้เป็นน้ำ แต่งรสด้วยมะนาวกับน้ำผึ้งนิดหน่อยให้พอกระเดือกได้ แล้วใส่ขวดโค้กยักษ์จุหนึ่งลิตรไปดื่มที่ที่ทำงาน ค่อยๆดื่มไปตั้งแต่มื้อเช้ายันมื้อเที่ยง พอบ่ายก็ทานสลัดที่ภรรยาทำใส่กล่องพลาสติกไปให้ กาแฟก็เปลี่ยนเป็นกาแฟดำ คุ้กกี้ที่ทานกับกาแฟก็เปลี่ยนเป็นถั่วหรือนัทที่ภรรยาอบมาให้จากบ้าน เป็นอย่างนี้ทุกวันเช้ายันเย็นไม่ทานข้าวหรือก๋วยเตี๋ยวหรือของแข็งอะไรอื่นเลย มีมื้อเย็นมื้อเดียวที่ผมทานอาหารปกติกับลูกเมียที่บ้าน แต่ก็ลดข้าวลงจากหนึ่งจานเต็มๆเหลือสองช้อน สองช้อนโต๊ะนะครับ ไม่ใช่สองทัพพี ชีวิตแบบนี้ก็ดีนะครับ สุขสบายกว่าเดิม โดยเฉพาะมื้อกลางวันไม่ต้องออกไปทานข้างนอกต้องคอยรับไหว้เด็กๆตั้งแต่เดินไป นั่งกิน แล้วเดินกลับ ไม่หนุกเลย

คราวนี้ก็มาถึงเรื่องการออกกำลังกาย ปัญหาแรกก็คือเวลา เพราะเช้าก็ต้องรีบไปทำงาน เย็นกลับมาก็สองสามทุ่ม ทานอาหารเสร็จก็ได้เวลานอนแล้ว ตอนแรกผมใช้วิธีออกไปเดินเร็วๆในหมู่บ้าน หมาเห่ากันเกรียวเพราะมันค่ำแล้ว แล้วผมเนี่ยมีนิสัยไม่ดีอยู่อย่างหนึ่ง คือชอบทะเลาะกับหมามาตั้งแต่เด็ก การออกไปวิ่งแต่ละครั้งแทนที่จะผ่อนคลายกลับกลายเป็นความเครียด จึงต้องเปลี่ยนใหม่ ซื้อเครื่องวิ่งสายพานมา มาตั้งไว้ในห้องทีวี ใหม่ๆก็ขยันเดินขยันวิ่งด้วยความลำบาก เพราะหากจะออกกำลังกายให้ได้ผลดีอย่างที่งานวิจัยเขาบอกไว้ ต้องออกกำลังกายให้ถึงระดับหนักพอควร ซึ่งนิยามว่าต้องหอบแฮ่กๆจนร้องเพลงไม่ได้ และต้องต่อเนื่อง ซึ่งนิยามว่าต้องแฮ่กๆต่อเนื่องกันไปอย่างน้อย 30นาที และต้องสม่ำเสมอ ซึ่งนิยามว่าต้องทำแบบนี้อย่างน้อยสัปดาห์ละ 5 ครั้ง ซึ่งพอลงมือทำแล้วมันไม่ง่ายเลย พอออกกำลังกายแล้วมันก็ปวดเมื่อย เหนื่อย และนอนมาก แต่เวลาของเรามีน้อย เริ่มต้นก็ทำได้ถี่ แล้วก็ค่อยๆห่างไปๆ จนเครื่องเดินสายพานกลายเป็นเครื่องประดับรกห้องทีวี ท้ายที่สุดทนดูมันไม่ได้ต้องย้ายไปไว้บนชั้นสาม เด็กคนใช้ชอบใจเพราะได้ที่ตากผ้า*****ริ้ว ผมเปลี่ยนไปซื้อเครื่องโยกแบบที่เรียกว่า elliptical มาแทน ก็ล้มเหลวอีก แล้วก็พยายามใหม่ แล้วก็ล้มเหลวอีก แล้วก็พยายามใหม่อีก แบบว่า.. ความพยายามอยู่ที่ไหน ความพยายามอยู่ที่นั่น เวลาผ่านไปหกเดือน ก็ยังออกกำลังกายไม่สำเร็จ

ในที่สุดผมต้องนั่งจับเข่าคุยกับตัวเองว่าถ้าผมเชื่อว่าการออกกำลังกายเป็นเรื่องสำคัญที่สุด ผมต้องทำมันก่อนสิ่งอื่นในแต่ละวัน เพราะในวิชาการบริหาร หลักการบริหารเวลาคือทำเรื่องสำคัญก่อน ดังนั้นตื่นเช้าขึ้นมาผมต้องออกกำลังกายก่อน ถ้าไม่ได้ออกกำลังกาย ยังไม่ต้องทำเรื่องอื่น เพราะเรื่องอื่นไม่สำคัญเท่า ฟันก็ไม่ต้องแปรง ถ้าไม่ได้ออกกำลังกายก็ไม่ต้องออกจากบ้าน เพราะฟันไม่ได้แปรงจะออกจากบ้านได้ยังไง มีบางวันที่ผมทะเลาะกับตัวเองแบบนี้จริงๆ คือ

“..วันนี้ต้องรีบแปรงฟัน เพราะจะไปประชุมแต่เช้า”

“..ไม่ได้ เอ็งยังแปรงฟันไม่ได้ เพราะยังไม่ได้ออกกำลังกาย”

“..จะบ้าเหรอ”

“..ไม่บ้าหรอก เราคุยกันแล้วนะ ว่าจะทำเรื่องสำคัญก่อน”

ในที่สุดสูตรนี้ก็เวอร์ค ผมตื่นมา ออกกำลังกายก่อน เริ่มตั้งแต่ในที่นอนเลย แล้วก็ไปต่อที่สนามหญ้าหน้าบ้าน วิ่งบ้าง ดึงสายยืด ยกดัมเบล เอาจักรยานออกไปขี่บ้าง รำมวยจีนบ้าง แล้วในที่สุดก็ทำได้อย่างต่อเนื่อง

หลังจากออกกำลังกายได้ต่อเนื่องเดือนเดียว ชีวิตผมก็เปลี่ยนไป พุงยุบจนเปลี่ยนกางเกงตามไม่ทัน น้ำหนักลดลง มองโลกในแง่ดีมากขึ้น และมีความกล้าตัดสินใจที่จะทำอะไรเพื่อตัวเองมากขึ้น พอผ่านไปได้หกเดือน ครบกำหนดตรวจร่างกายประจำปี ทุกอย่างกลับมาเป็นปกติหมด ทั้งความดันเลือด ไขมันในเลือด และน้ำหนัก มันเหลือเชื่อจริงๆ การเปลี่ยนชีวิต ทำให้ผมเลิกยาวันละกำมือได้ นี่ขนาดผมยังไม่ได้เริ่มทำอย่างที่สามจริงจังเลยนะ คือการจัดการความเครียด ผมยังไม่ได้เริ่มจริงจังเลย

ณ จุดนั้นผมมานั่งคิดใคร่ครวญดู ตัวเราหรือก็อายุก็ห้าสิบปลายๆแล้ว จะผ่าตัดหัวใจให้คนไข้ไปได้อีกอย่างมากก็สองสามร้อยคนแล้วก็เกษียณ ผ่าไปแล้วพวกเขาใช่ว่าจะหายจากโรค อีกสิบปีถ้ายังไม่ตายก็จะพากันกลับมาให้ผ่าใหม่ แล้วเวลาในชีวิตของผมเองก็เหลืออยู่จำกัด ยิ่งเวลาในชีวิตงวดลง เวลาก็ยิ่งดูจะมีค่ามากยิ่งขึ้นทุกที ผมจะใช้ชีวิตที่เหลืออยู่ทำผ่าตัดอีกต่อไปอย่างนี้หรือ ทำไม่ผมไม่ทิ้งการผ่าตัดให้คนรุ่นหลังเขาทำกันไปละ ตัวผมเปลี่ยนไปทำอะไรที่ช่วยคนไข้ในวงกว้างได้ถาวรกว่าการผ่าตัดหัวใจเสียไม่ดีกว่าหรือ

คิดได้แล้วผมก็ตัดสินใจเลย คือลาออกจากการเป็นผู้อำนวยการโรงพยาบาล เลิกผ่าตัดหัวใจ หันไปเรียนหนังสือใหม่ ไปฝึกอบรมเป็นผู้เชี่ยวชาญด้านเวชศาสตร์ครอบครัว จะได้ทำงานป้องกันโรคและส่งเสริมสุขภาพได้เต็มไม้เต็มมือ อ่านหนังสือและทำวิจัยอยู่สองปีก็สอบเป็นผู้เชี่ยวชาญสาขาเวชศาสตร์ครอบครัวหรือ Family Medicine ได้ ไปสอบกับหมอรุ่นเด็กๆตอนอายุห้าสิบปลายๆนะ ปูนนี้แล้วคนเราถ้าไม่ตั้งใจจริงก็คงไม่ทำ จากนั้นก็เปลี่ยนอาชีพมาเป็นหมอทั่วไป ไม่ผ่าตัด ไม่รักษาคนป่วยแล้ว แต่ให้คำแนะนำคนดีๆที่ยังไม่ป่วยว่าต้องเปลี่ยนชีวิตอย่างไร จึงจะไม่ป่วย ทั้งในรูปแบบพบกันแบบface to face ที่คลินิก เขียนบล็อกสอนคนทั่วไปทางอินเตอร์เน็ท เขียนหนังสือสุขภาพ ทำรายการทีวี. เปิด Health Camp ที่มวกเหล็กเพื่อสอนเรื่องสุขภาพ และหาเวลามาสอนคนเป็นกลุ่มๆ อย่างที่เรามาพบกันวันนี้ และจะได้อยู่ที่นี่ร่วมกันที่รีสอร์ทแห่งนี้ไปอีกนานสามวันสองคืน

ครับ.. ที่ท่านได้รับฟังจบไปแล้วนั้นคือการแนะนำตัวเองของวิทยากร เป็นการแนะนำตัวเองที่ยาวสักหน่อยนะ ก่อนจะจบ session แนะนำตัวเองนี้ ผมเปิดโอกาสให้ทุกท่านได้พูดคุยแลกเปลี่ยนหรือซักถาม ใช้วิธียกมือแล้วน้องเขาจะเอาไมโครโฟนไปส่งให้ถึงที่เอง.. เชิญ lady first ขอทางนี้ก่อนนะครับ

นพ.สันต์ ใจยอดศิลป์



ปล. ผมกำลังคิดอะไรอยู่? +12345
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-26 22:07:34 By : หน้าฮี
 


 

No. 19



โพสกระทู้ ( 4,434 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook



ได้ความรู้เพิ่มอีกเยอะเลยครับ
ปัญหานี้ทำให้ผมไม่อยากใช้โปรแกรมเถื่อนไปตั้ง 3 วิ



ปล.
ผมแก้ปัญหา openFileDialog โดยปิด DefaultValue

Code (C#)
// [System.ComponentModel.DefaultValue(SelectedPathType.OpenFileDialog)]


ซึ่งก็ไม่รู้อีกเหมือนกันว่าทำแค่นี้ทำไมถึงเปลี่ยนได้ก็ไม่รู้ครับ
แต่ยังไงก็ตามผมได้ DataGridViewDataGridView มาใช้งานสมที่ตั้งใจแล้วครับ

Code (C#)
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TORServices.Forms.Datagridview
{
    #region _DataGridViewDialog
    /// <summary>
    /// Hosts a collection of DataGridViewTextBoxCell cells.
    /// </summary>
    public class DataGridViewDialogColumn : System.Windows.Forms.DataGridViewColumn
    {
        private bool showBrowseButton;
        [System.ComponentModel.Browsable(true)]
        // [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Always)]
        [System.ComponentModel.DefaultValue(false)]
        [System.ComponentModel.Category("Appearance")]
        [System.ComponentModel.Description("Show a button in each cell for browsing for files.")]
        public enum SelectedPathType { colorDialog, folderDialog, fontDialog, OpenFileDialog, SaveFileDialog }
        public bool ShowBrowseButton
        {
            get { return showBrowseButton; }
            set
            {

                showBrowseButton = value;
            }
        }
        public override object Clone()
        {
            var clm = base.Clone() as DataGridViewDialogColumn;
            DataGridViewDialogColumn xxx = base.Clone() as DataGridViewDialogColumn;
            if (clm != null)
            {
                clm.SelectedMode = _selected;
                clm.ShowBrowseButton = showBrowseButton;
            }
            return clm;
        }
        private bool useOpenFileDialogOnButtonClick;
        [System.ComponentModel.Browsable(true)]
        [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Always)]
        [System.ComponentModel.DefaultValue(false)]
        [System.ComponentModel.Category("Behavior")]
        [System.ComponentModel.Description("Dialog is dispalyed and on success the contents of the Cell is replaced with the new file path.")]
        public bool UseOpenFileDialogOnButtonClick
        {

            get { return useOpenFileDialogOnButtonClick; }
            set
            {
                useOpenFileDialogOnButtonClick = value;
            }
        }
        private SelectedPathType _selected;
        [System.ComponentModel.Browsable(true)]
        //[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Always)]
        // [System.ComponentModel.DefaultValue(SelectedPathType.OpenFileDialog)]
        [System.ComponentModel.Category("Behavior")]
        [System.ComponentModel.Description("Open Dialog is dispalyed and on success the contents of the Cell is replaced with the new  path.")]
        public SelectedPathType SelectedMode
        {
            get { return _selected; }
            set
            {
                _selected = value;
            }
        }
        public DataGridViewDialogColumn()
            : base(new DataGridViewDialogCell())
        {
        }
        public override System.Windows.Forms.DataGridViewCell CellTemplate
        {
            get
            {
                return base.CellTemplate;
            }
            set
            {
                if (null != value &&
                    !value.GetType().IsAssignableFrom(typeof(DataGridViewDialogCell)))
                {
                    throw new InvalidCastException("must be a DataGridViewDialogCell");
                }
                base.CellTemplate = value;
            }
        }
    }

    /// <summary>
    /// Displays editable text information in a DataGridView control. Uses
    /// PathEllipsis formatting if the column is smaller than the width of a
    /// displayed filesystem path.
    /// </summary>

    public class DataGridViewDialogCell : DataGridViewLinkCell
    {
        Button browseButton;

        Dictionary<Color, SolidBrush> brushes = new Dictionary<Color, SolidBrush>();

        protected virtual SolidBrush GetCachedBrush(Color color)
        {
            if (this.brushes.ContainsKey(color))
                return this.brushes[color];
            SolidBrush brush = new SolidBrush(color);
            this.brushes.Add(color, brush);
            return brush;
        }

        protected virtual bool RightToLeftInternal
        {
            get
            {
                return this.DataGridView.RightToLeft == RightToLeft.Yes;
            }
        }
        protected override void OnClick(DataGridViewCellEventArgs e)
        {
            base.OnClick(e);
            if (this.DataGridView.CurrentCell == this)
            {
                string _Value = Convert.ToString(base.Value);
                DataGridViewDialogColumn filePathColumn = (DataGridViewDialogColumn)this.DataGridView.Columns[ColumnIndex];
                if (filePathColumn.SelectedMode == DataGridViewDialogColumn.SelectedPathType.OpenFileDialog)
                {
                    if (!System.IO.File.Exists(_Value))
                    { MessageBox.Show("ไม่พบ " + _Value); }
                    else
                    { System.Diagnostics.Process.Start(_Value); }
                }
                if (filePathColumn.SelectedMode == DataGridViewDialogColumn.SelectedPathType.folderDialog)
                {
                    if (!System.IO.Directory.Exists(_Value))
                    { MessageBox.Show("ไม่พบ " + _Value); }
                    else
                    { System.Diagnostics.Process.Start(_Value); }
                }
            }
        }
        protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            if (cellStyle == null) { throw new ArgumentNullException("cellStyle"); }
            this.PaintPrivate(graphics, clipBounds, cellBounds, rowIndex, cellState, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
        }

        protected Rectangle PaintPrivate(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            System.Diagnostics.Debug.WriteLine(string.Format("Painting Cell row {0} for rowindex {2} with rectangle {1}", this.RowIndex, cellBounds, rowIndex));
            SolidBrush cachedBrush;
            Rectangle empty = Rectangle.Empty;
            if (((paintParts & DataGridViewPaintParts.Border) != DataGridViewPaintParts.None)) { this.PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle); }
            Rectangle rectangle2 = this.BorderWidths(advancedBorderStyle);
            Rectangle borderedCellRectangle = cellBounds;
            borderedCellRectangle.Offset(rectangle2.X, rectangle2.Y);
            borderedCellRectangle.Width -= rectangle2.Right;
            borderedCellRectangle.Height -= rectangle2.Bottom;
            Point currentCellAddress = base.DataGridView.CurrentCellAddress;
            bool isFirstCell = (currentCellAddress.X == base.ColumnIndex) && (currentCellAddress.Y == rowIndex);
            bool flagisFirstCellAndNotEditing = isFirstCell && (base.DataGridView.EditingControl != null);
            bool thisCellIsSelected = (cellState & DataGridViewElementStates.Selected) != DataGridViewElementStates.None;
            cachedBrush = ((((paintParts & DataGridViewPaintParts.SelectionBackground) != DataGridViewPaintParts.None) && thisCellIsSelected) && !flagisFirstCellAndNotEditing) ? GetCachedBrush(cellStyle.SelectionBackColor) : GetCachedBrush(cellStyle.BackColor);

            if (((((paintParts & DataGridViewPaintParts.Background) != DataGridViewPaintParts.None)) && ((cachedBrush.Color.A == 0xff) && (borderedCellRectangle.Width > 0))) && (borderedCellRectangle.Height > 0))
            {
                graphics.FillRectangle(cachedBrush, borderedCellRectangle);
            }
            if (cellStyle.Padding != Padding.Empty)
            {
                if (RightToLeftInternal)
                {
                    borderedCellRectangle.Offset(cellStyle.Padding.Right, cellStyle.Padding.Top);
                }
                else
                {
                    borderedCellRectangle.Offset(cellStyle.Padding.Left, cellStyle.Padding.Top);
                }
                borderedCellRectangle.Width -= cellStyle.Padding.Horizontal;
                borderedCellRectangle.Height -= cellStyle.Padding.Vertical;
            }
            if (((isFirstCell) && (!flagisFirstCellAndNotEditing && ((paintParts & DataGridViewPaintParts.Focus) != DataGridViewPaintParts.None))) && ((ShowFocusCues && base.DataGridView.Focused) && ((borderedCellRectangle.Width > 0) && (borderedCellRectangle.Height > 0))))
            {
                ControlPaint.DrawFocusRectangle(graphics, borderedCellRectangle, Color.Empty, cachedBrush.Color);
            }
            Rectangle cellValueBounds = borderedCellRectangle;
            string text = formattedValue as string;
            if ((text != null) && (!flagisFirstCellAndNotEditing))
            {
                int y = (cellStyle.WrapMode == DataGridViewTriState.True) ? 1 : 2;
                borderedCellRectangle.Offset(0, y);
                borderedCellRectangle.Width = borderedCellRectangle.Width;
                borderedCellRectangle.Height -= y + 1;
                if ((borderedCellRectangle.Width > 0) && (borderedCellRectangle.Height > 0))
                {
                    TextFormatFlags flags = TextFormatFlags.PathEllipsis;

                    if (((paintParts & DataGridViewPaintParts.ContentForeground) != DataGridViewPaintParts.None))
                    {
                        if ((flags & TextFormatFlags.SingleLine) != TextFormatFlags.GlyphOverhangPadding) { flags |= TextFormatFlags.EndEllipsis; }
                        DataGridViewDialogColumn filePathColumn = (DataGridViewDialogColumn)this.DataGridView.Columns[ColumnIndex];

                        if (this.RowIndex >= 0)
                        {

                            bool changed = false;
                            if ((browseButton.Width != System.Math.Max(10, borderedCellRectangle.Width / 4)) && (browseButton.Width != 20))
                            {
                                System.Diagnostics.Trace.WriteLine(string.Format("browseButton Width was incorrect:{0} for given rectangle:{1}", browseButton.Width, borderedCellRectangle));
                                browseButton.Width = System.Math.Max(10, borderedCellRectangle.Width / 4);
                                browseButton.Width = System.Math.Min(browseButton.Width, 20);
                                changed = true;
                            }
                            if (browseButton.Height != (borderedCellRectangle.Height + 4))
                            {
                                System.Diagnostics.Trace.WriteLine(string.Format("browseButton Height was incorrect:{0} for given rectangle:{1}", browseButton.Height, borderedCellRectangle));
                                browseButton.Height = borderedCellRectangle.Height + 4;
                                changed = true;
                            }
                            Point loc = new Point();
                            loc.X = borderedCellRectangle.X + borderedCellRectangle.Width - browseButton.Width;
                            loc.Y = borderedCellRectangle.Y - 4;
                            if (browseButton.Location != loc)
                            {
                                System.Diagnostics.Trace.WriteLine(string.Format("browseButton location was incorrect:{0} for given rectangle:{1} with loc: {2}", browseButton.Location, borderedCellRectangle, loc));
                                browseButton.Location = loc;
                                changed = true;
                            }
                            if (changed)
                                browseButton.Invalidate();
                            if (!this.DataGridView.Controls.Contains(browseButton))
                                this.DataGridView.Controls.Add(browseButton);
                            borderedCellRectangle.Width -= browseButton.Width;
                        }
                    }
                    TextRenderer.DrawText(graphics, text, cellStyle.Font, borderedCellRectangle, thisCellIsSelected ? cellStyle.SelectionForeColor : cellStyle.ForeColor, flags);


                }
            }
            if ((base.DataGridView.ShowCellErrors) && ((paintParts & DataGridViewPaintParts.ErrorIcon) != DataGridViewPaintParts.None))
            {
                if ((!string.IsNullOrEmpty(errorText) && (cellValueBounds.Width >= 20)) && (cellValueBounds.Height >= 0x13))
                {
                    Rectangle iconBounds = this.GetErrorIconBounds(graphics, cellStyle, rowIndex);
                    if ((iconBounds.Width >= 4) && (iconBounds.Height >= 11))
                    {
                        iconBounds.X += cellBounds.X;
                        iconBounds.Y += cellBounds.Y;
                        Bitmap errorBitmap = new Bitmap(typeof(DataGridViewCell), "DataGridViewRow.error.bmp");
                        errorBitmap.MakeTransparent();
                        if (errorBitmap != null)
                        {
                            lock (errorBitmap)
                            {
                                graphics.DrawImage(errorBitmap, iconBounds, 0, 0, 12, 11, GraphicsUnit.Pixel);
                            }
                        }
                    }
                }

            }
            return empty;
        }

        public bool ShowFocusCues
        {
            get { return true; }
        }

        protected bool ApplyVisualStylesToHeaders
        {
            get
            {
                if (Application.RenderWithVisualStyles)
                {
                    return this.DataGridView.EnableHeadersVisualStyles;
                }
                return false;
            }
        }
        private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (base.Value.ToString().Length > 0)
            {
                System.Diagnostics.Process.Start(base.Value.ToString());
            }
        }
        void browseButton_Click(object sender, EventArgs e)
        {
            DataGridViewDialogColumn filePathColumn = (DataGridViewDialogColumn)this.DataGridView.Columns[ColumnIndex];
            try
            {
                if (filePathColumn.SelectedMode == DataGridViewDialogColumn.SelectedPathType.OpenFileDialog)
                {
                    OpenFileDialog dialog = new OpenFileDialog();
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {

                        base.Value = dialog.FileName.ToString();

                    }
                }
                else if (filePathColumn.SelectedMode == DataGridViewDialogColumn.SelectedPathType.folderDialog)
                {
                    FolderBrowserDialog dialog = new FolderBrowserDialog();
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {
                        base.Value = dialog.SelectedPath;
                    }
                }
                else if (filePathColumn.SelectedMode == DataGridViewDialogColumn.SelectedPathType.colorDialog)
                {
                    ColorDialog dialog = new ColorDialog();
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {
                        base.Value = dialog.Color.ToString() + ":"
                                       + dialog.Color.Name.ToString()
                                      + ": A=" + dialog.Color.A + " R=" + dialog.Color.R + " G=" + dialog.Color.G + " B=" + dialog.Color.B;
                    }
                }
                else if (filePathColumn.SelectedMode == DataGridViewDialogColumn.SelectedPathType.fontDialog)
                {
                    FontDialog dialog = new FontDialog();
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {
                        base.Value = dialog.Font.ToString();
                    }
                }
                else if (filePathColumn.SelectedMode == DataGridViewDialogColumn.SelectedPathType.SaveFileDialog)
                {
                    SaveFileDialog dialog = new SaveFileDialog();
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {
                        base.Value = dialog.FileName;
                    }
                }
            }
            catch (Exception)
            {
            }
        }
        public DataGridViewDialogCell()
            : base()
        {
            browseButton = new Button();
            browseButton.Text = "…";
            browseButton.Click += new EventHandler(browseButton_Click);
        }
    }
    #endregion
}




ประวัติการแก้ไข
2016-09-26 22:36:24
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-26 22:18:27 By : lamaka.tor
 


 

No. 20

Guest


@lamaka.tor คุณเชื่อผมไหมว่า? จาก #NO 1 - #NO 18
---- จริงฯแล้วผมเขียน C# ไม่เป็น (ผมถนัด VB.NET) (ผมอาศัย Tools บน Internet Convert C# To VB และ VB To C#)

คุณคิดว่าผมควรจะต้อง (ทำ) หรือ (ค่อยเป็นค่อยไป) แปลงความถนัด(นิสัย) ของผม จาก VB ---> C# หรือไม่? (จากแรงบันดาลใจ #NO 18)

+ ปล. ไม่มีอะไรลึกฯ ก็แค่เล่าสู่กันฟัง แค่นั้นเองครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-26 22:25:11 By : หน้าฮี
 


 

No. 21



โพสกระทู้ ( 4,434 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 20 เขียนโดย : หน้าฮี เมื่อวันที่ 2016-09-26 22:25:11
รายละเอียดของการตอบ ::

นอนดึกขนาดนี้ซักเมาดีกว่าไม๊ท่าน
ขอบคุณมากครับ
ผมกระจ่างขึ้นเยอะเกี่ยวกับ Usercontrol ครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-26 22:39:18 By : lamaka.tor
 


 

No. 22

Guest


Quote:
(พ่อแม่ของคนบางคน/บางคำถาม ยังไม่เกิดมั้ง +55555


คุณลองสังเกตุดูว่าประโยคที่ผมเหน็บ "(พ่อแม่ของคนบางคน/บางคำถาม ยังไม่เกิดมั้ง +55555)"
--- ผมเจอมาเยอะเด็กฯ อายุ 40-60 ปี (พวกคุณมักจะเรียกว่า ครู/อาจารย์) [แก่เพราะอยู่นาน]
---

ผมดีใจที่ประโยคนี้ "ใช้ไม่ได้กับคุณ @lamaka.tor"

ปล. วันพรุ่งนี้ผมต้องไป รพ. ...
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-09-26 23:03:06 By : หน้าฮี
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : C# WinApp ปัญหาการใส่ค่าใน property ของ User control ใน datagrid ครับ
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 05
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่