zoukankan      html  css  js  c++  java
  • Winform下的Datagrid的列风格(4)—DataGridComboBoxTableViewColumn

    class  DataGridComboBoxTableViewColumn: DataGridColumnStyle 
        
    {//与DataGridComboBoxColumn不同,显示时使用DataTable,下拉时使用DataView
            private ComboBox myComboBox = new ComboBox ();
            
    private DataView ChoiceDataViewSource;
            
    private DataView TableDataViewSource;
            
    private string ChoiceDisplayField;
            
    private string ChoiceValueField;
            
    private bool isEditing;

            
    public DataGridComboBoxTableViewColumn(DataView ChoiceDataViewSource,string ChoiceDisplayField,string ChoiceValueField) : base() 
            
    {
                
    this.ChoiceDataViewSource =ChoiceDataViewSource;
                TableDataViewSource
    =new System.Data .DataView (ChoiceDataViewSource.Table);
                
    this.ChoiceDisplayField =ChoiceDisplayField;
                
    this.ChoiceValueField =ChoiceValueField;
                myComboBox.DropDownStyle 
    =System.Windows .Forms .ComboBoxStyle .DropDownList  ;
                myComboBox.Visible 
    = false;
                myComboBox.DataSource 
    =this.ChoiceDataViewSource;
                myComboBox.DisplayMember
    = this.ChoiceDisplayField;
                myComboBox.ValueMember 
    =this.ChoiceValueField;
            }

            
    protected override void Abort(int rowNum)
            
    {
                isEditing 
    = false;
                myComboBox.SelectedIndexChanged 
    -= 
                    
    new EventHandler(ComboBoxSelectedIndexChanged );
                Invalidate();
            }


            
    protected override bool Commit
                (CurrencyManager dataSource, 
    int rowNum) 
            
    {
                myComboBox.Bounds 
    = Rectangle.Empty;
             
                myComboBox.SelectedIndexChanged 
    -= 
                    
    new EventHandler(ComboBoxSelectedIndexChanged );

                
    if (!isEditing)
                    
    return true;

                isEditing 
    = false;

                
    try 
                
    {
                    System.Object  value 
    = myComboBox.SelectedValue;
                    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) 
            
    {
                
    object value =GetColumnValueAtRow(source, rowNum);
                
    if (cellIsVisible) 
                
    {
                    myComboBox.Bounds 
    = new Rectangle
                        (bounds.X 
    + 2, bounds.Y + 2
                        bounds.Width 
    - 4, bounds.Height - 4);
                    
    int i=    Find (value);
                    
    if (myComboBox.Items .Count >i)
                    
    {
                        myComboBox.SelectedIndex 
    =i;
                    }

                    myComboBox.Visible 
    = true;
                    myComboBox.SelectedIndexChanged 
    += 
                        
    new EventHandler(ComboBoxSelectedIndexChanged );
                }
     
                
    else 
                
    {
                    myComboBox.SelectedIndex 
    =this.Find (value);
                    myComboBox.Visible 
    = false;
                }


                
    if (myComboBox.Visible)
                    DataGridTableStyle.DataGrid.Invalidate(bounds);
            }

            
    protected int Find(System.Object value)
            
    {
                
    int int1;
                
    int int2;
                
                int2
    =TableDataViewSource.Count ;
                
    if (int2<=0)
                
    {
                    
    return -1;
                }

                
    for (int1=0;int1<int2;int1++)
                
    {
                    
    if (TableDataViewSource[int1][this.myComboBox .ValueMember ].ToString ().Trim ()==value.ToString ().Trim ())
                    
    {
                        
    return int1;
                    }

                }

                
    return -1;
            }


            
    protected override Size GetPreferredSize(
                Graphics g, 
                
    object value) 
            
    {
                
    return new Size(100, myComboBox.PreferredHeight+ 4);
            }


            
    protected override int GetMinimumHeight() 
            
    {
                
    return myComboBox.PreferredHeight + 4;
            }


            
    protected override int GetPreferredHeight(Graphics g, 
                
    object value) 
            
    {
                
    return myComboBox.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) 
            
    {
                
    object value=GetColumnValueAtRow(source, rowNum);
                
    int int1=Find (value);
                
    string display="";
                
    if (int1>=0)
                
    {
                    display
    =this.TableDataViewSource [int1][this.myComboBox .DisplayMember ].ToString ();
                }

                Rectangle rect 
    = bounds;
                g.FillRectangle(backBrush,rect);
                rect.Offset(
    02);
                rect.Height 
    -= 2;
                g.DrawString(display, 
                    
    this.DataGridTableStyle.DataGrid.Font, 
                    foreBrush, rect);
            }


            
    protected override void SetDataGridInColumn(DataGrid value) 
            
    {
                
    base.SetDataGridInColumn(value);
                
    if (myComboBox.Parent != null
                
    {
                    myComboBox.Parent.Controls.Remove 
                        (myComboBox);
                }

                
    if (value != null
                
    {
                    value.Controls.Add(myComboBox);
                }

            }


            
    private void ComboBoxSelectedIndexChanged(object sender, EventArgs e) 
            
    {
                
    this.isEditing = true;
                
    base.ColumnStartedEditing(myComboBox);
            }

        }

  • 相关阅读:
    Spring3系列4-多个配置文件的整合
    Spring3系列3 -- JavaConfig
    Spring3系列2 -- 松耦合的实现
    Spring3系列1 -- HelloWord例子
    Maven3路程(六)用Maven创建Spring3 MVC项目
    用Hibernate Tools生成Hibernate Mapping映射文件
    在Maven仓库中添加Oracle JDBC驱动
    Maven3路程(四)用Maven创建Struts2项目
    Maven3路程(三)用Maven创建第一个web项目(2)servlet演示
    Eclipse中集成Tomcat
  • 原文地址:https://www.cnblogs.com/yitian/p/1290000.html
Copyright © 2011-2022 走看看