用户在gridview中对列进行排序后如何保持格式

时间:2017-11-07 13:58:05

标签: c# visual-studio datagridview eventhandler columnsorting

当我从数据库中获取数据时,行是彩色编码的。但是,当用户单击列进行排序时,颜色格式将被丢弃,并且所有行都变为白色。我已经搜索了答案,发现有些人遇到与我相同的问题。他们已经实现了某种事件处理程序(例如DataBindingCompleteCellFormatting)以便在保留或重新实例化格式之后那种。但是,我没有这个工作。有人可以解释原因,或者告诉我另一种方法可以解决这个问题吗?

这是从数据库中获取数据并填充gridview

的代码
public static OdbcConnection DbConnection; // Create an object for the DB connection  
public static MainWindow mw = Form.ActiveForm as MainWindow;

public static void TestSqlToGridView()
{
    // https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.datagridview.datasource?view=netframework-4.7.1

    //var mw = Form.ActiveForm as MainWindow;
    ConnectToDB();

    DbConnection.Open();

    BindingSource bindingSource = new BindingSource();

    // Automatically generate the DataGridView columns.
    SuspendDrawing(mw.dataGridView); // wait with drawing until all data is read
    bindingSource.DataSource = GetData( Laddstatus() );
    mw.dataGridView.DataSource = bindingSource;

    SetRowColor(); // Change the rows color           

    mw.dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader; // Adjusting the size of header cells !!! AllCells = SLOW !!!
    ResumeDrawing(mw.dataGridView); // draw all cells

    // Set the DataGridView control's border.
    mw.dataGridView.BorderStyle = BorderStyle.Fixed3D;

    DbConnection.Close();
}

这是我尝试重新启动格式

的方式
void dataGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    // This event is raised when the contents of the data source 
    // change or when the value of the DataSource, DataMember, or BindingContext 
    // property changes.

    Print("DatabindingComplete!"); //DEBUG
    SetRowColor();
}

但出于某些原因,当我按列标题进行排序时,似乎从未调用过该事件。我必须放在特定的位置吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

  

[我]似乎从未调用事件。我必须放在特定的位置吗?

是 - ISH 。您已添加了事件处理程序,但您需要subscribe (attach) to the event。这可以通过多种方式完成:

  1. 在设计模式下,双击DataBindingComplete下的Properties -> Events事件:

    Properties -> Events -> DataBingingComplete (highlighted)

    这会将空处理程序存根到您的Form.cs文件,并附加到Form.designer.cs文件中的事件:

    this.dataGridView1.DataBindingComplete += new System.Windows.Forms.DataGridViewBindingCompleteEventHandler(this.dataGridView1_DataBindingComplete);
    
  2. 表单构造函数或Load事件中
  3. 以编程方式

    this.dataGridView1.DataBindingComplete += this.dataGridView1_DataBindingComplete;
    
  4. 这应该会给你想要的结果:

    Colored rows - Not sorted Colored rows - Sorted

    <强> WHY吗

    通过订阅事件,您将附加处理程序以在基本事件完成后运行。否则,它永远不会被调用。可以多次订阅多个处理程序。例如,以下内容:

    this.dataGridView1.DataBindingComplete += DataGridView1_DataBindingComplete1;
    this.dataGridView1.DataBindingComplete += DataGridView1_DataBindingComplete2;
    this.dataGridView1.DataBindingComplete += DataGridView1_DataBindingComplete3;
    this.dataGridView1.DataBindingComplete += DataGridView1_DataBindingComplete1;
    
    private void DataGridView1_DataBindingComplete1(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        Console.WriteLine("First");
    }
    
    private void DataGridView1_DataBindingComplete2(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        Console.WriteLine("Second");
    }
    
    private void DataGridView1_DataBindingComplete3(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        Console.WriteLine("Third");
    }
    

    每次dataGridView1.DataBindingComplete触发时都会产生以下输出:

    /*
    First
    Second
    Third
    First
    */
    

    注意只能订阅(+=)一次事件 - 否则可能会产生奇怪的结果,资源泄漏和/或使运行时间陷入困境(例如,重复附加昂贵/大型处理程序时) )。这可以通过从事件中取消订阅(-=)来解决。

答案 1 :(得分:0)

正如你自己建议的那样:

Private Sub dgwList_DataBindingComplete(sender As Object, e As DataGridViewBindingCompleteEventArgs) Handles dgwList.DataBindingComplete
    Call ColorMyRows()
End Sub

C#:

Private void dgwList_DataBindingComplete(Object sender, DataGridViewBindingCompleteEventArgs e)
{
    ColorMyRows();
}

这是我这样做的方式,只要您使用DataSource填充DataGridView就可以正常工作。

但是第二次看你的代码,你有SuspendDrawing,然后你做数据绑定,然后再次ResumeDrawing! 这将禁用此活动