Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在gridview中对列进行用户排序后保持格式_C#_Visual Studio_Datagridview_Eventhandler_Columnsorting - Fatal编程技术网

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

C# 如何在gridview中对列进行用户排序后保持格式,c#,visual-studio,datagridview,eventhandler,columnsorting,C#,Visual Studio,Datagridview,Eventhandler,Columnsorting,当我从数据库中获取数据时,行是彩色编码的。但是,当用户单击列进行排序时,颜色格式将被丢弃,所有行将变为白色。我搜索了答案,发现一些人与我有相同的问题。他们实现了某种eventhandler(例如DataBindingComplete或CellFormatting),以便在排序后保留或重新实例化格式。然而,我不能让它工作。有人能解释一下原因,或者告诉我解决这个问题的另一种方法吗 这是从数据库获取数据并填充gridview的代码 public static OdbcConnection DbConn

当我从数据库中获取数据时,行是彩色编码的。但是,当用户单击列进行排序时,颜色格式将被丢弃,所有行将变为白色。我搜索了答案,发现一些人与我有相同的问题。他们实现了某种eventhandler(例如
DataBindingComplete
CellFormatting
),以便在排序后保留或重新实例化格式。然而,我不能让它工作。有人能解释一下原因,或者告诉我解决这个问题的另一种方法吗

这是从数据库获取数据并填充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();
}
但由于某种原因,当我按列标题进行排序时,似乎从未调用该事件。我必须把它放在一个特定的位置吗


谢谢你的帮助

正如你建议的那样:

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

这是我这样做的一种方式,只要您使用DataSource填充DataGridView,它就可以工作

但是第二次查看代码时,您有了SuspendDrawing,然后执行数据绑定,然后再次恢复绘图将禁用此事件

[一] 这件事似乎从来没有发生过。我必须把它放在一个特定的位置吗

是的。您已经添加了事件处理程序,但需要。这可以通过多种方式实现:

  • 在设计模式下双击
    属性->事件下的
    数据绑定完成
    事件

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

    this.dataGridView1.DataBindingComplete += new System.Windows.Forms.DataGridViewBindingCompleteEventHandler(this.dataGridView1_DataBindingComplete);
    
  • 以编程方式在窗体构造函数或
    加载
    事件中:

    this.dataGridView1.DataBindingComplete += this.dataGridView1_DataBindingComplete;
    
  • 这将为您提供所需的结果:


    为什么?

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

    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
    */
    

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

    我最初的想法是:确保您已连接到事件处理程序。也就是说,您应该有一行代码,如
    mw.dataGridView.DataBindingComplete+=dataGridView\u DataBindingComplete可以在窗体构造函数中,也可以在designer.cs文件中。@Ohboose谢谢您的评论!不知怎么的,它帮助了我。请将其添加为答案,以便我可以将其标记为解决方案!如果您可以/希望添加一个解释,说明为什么我必须附加到事件处理程序。由于顺序的原因,它无法工作:SuspendDrwaing-DataSource(带有DataBidingComplete事件)-ResumeDrawing。看看我的回答。我将使用另一种方法来加速DataGridView并消除挂起。在我的测试中,挂起/恢复绘图的顺序不会影响任何事情。SuspendDrawing函数似乎不会影响事件。我没有改变它们的顺序,它仍然可以使用上述解决方案。谢谢你的回答!:)是的,我认为奥比兹的解决方案是对的,而我上一个建议是错的。但我很高兴你找到了解决办法。
    
    /*
    First
    Second
    Third
    First
    */