相关疑难解决方法(0)

WinForms C#中的优雅日志窗口

我正在寻找一种有效的方法来实现Windows窗体应用程序的日志窗口.在过去,我已经使用TextBox和RichTextBox实现了几个,但我仍然不完全满意这个功能.

此日志旨在向用户提供各种事件的近期历史记录,主要用于数据收集应用程序,其中可能会对特定事务的完成方式感到好奇.在这种情况下,日志不必是永久性的,也不必保存到文件中.

首先,一些提出的要求:

  • 高效快速; 如果快速连续地将数百行写入日志,则需要消耗最少的资源和时间.
  • 能够提供最多2000行左右的可变回滚.更长的时间是不必要的.
  • 突出和颜色是首选.不需要字体效果.
  • 达到回滚限制时自动修剪线条.
  • 添加新数据时自动滚动.
  • 奖励但不是必需的:在手动交互期间暂停自动滚动,例如用户正在浏览历史记录.

到目前为止我一直用来编写和修剪日志:

我使用以下代码(我从其他线程调用):

// rtbLog is a RichTextBox
// _MaxLines is an int
public void AppendLog(string s, Color c, bool bNewLine)
{
    if (rtbLog.InvokeRequired)
    {
        object[] args = { s, c, bNewLine };
        rtbLog.Invoke(new AppendLogDel(AppendLog), args);
        return;
    }
    try
    {
        rtbLog.SelectionColor = c;
        rtbLog.AppendText(s);
        if (bNewLine) rtbLog.AppendText(Environment.NewLine);
        TrimLog();
        rtbLog.SelectionStart = rtbLog.TextLength;
        rtbLog.ScrollToCaret();
        rtbLog.Update();
    }
    catch (Exception exc)
    {
        // exception handling
    }
}

private void TrimLog()
{
    try
    {
        // Extra …
Run Code Online (Sandbox Code Playgroud)

c# logging winforms

56
推荐指数
6
解决办法
5万
查看次数

更新单个ListViewItem的文本时如何防止ListView中的闪烁?

我想要的只是更新ListViewItem的文本,而不会看到任何闪烁.

这是我的更新代码(多次调用):

listView.BeginUpdate();
listViewItem.SubItems[0].Text = state.ToString();    // update the state
listViewItem.SubItems[1].Text = progress.ToString(); // update the progress
listView.EndUpdate();
Run Code Online (Sandbox Code Playgroud)

我见过一些涉及覆盖组件的解决方案 WndProc():

protected override void WndProc(ref Message m)
{
    if (m.Msg == (int)WM.WM_ERASEBKGND)
    {
        m.Msg = (int)IntPtr.Zero;
    }
    base.WndProc(ref m);
}
Run Code Online (Sandbox Code Playgroud)

他们说这解决了问题,但在我的情况下却没有.我相信这是因为我在每个项目上使用图标.

.net c# listview winforms

46
推荐指数
4
解决办法
4万
查看次数

更新时防止列表框滚动到顶部

我正在尝试使用 ListBox 播放列表构建一个简单的音乐播放器。将音频文件添加到播放列表时,它首先用文件名填充列表框,然后(在单独的线程上)提取 ID3 数据并用正确的艺术家 - 标题信息(很像 Winamp)覆盖文件名。

但是当 ListBox 正在更新时,它是不可滚动的,因为它总是在每个项目覆盖时跳转到顶部。

有什么办法可以防止这种情况吗?

编辑:
代码:

public Form1()
{
    //Some initialization code omitted here

    BindingList<TAG_INFO> trackList = new BindingList<TAG_INFO>();

    // The Playlist
    this.playlist = new System.Windows.Forms.ListBox();
    this.playlist.Location = new System.Drawing.Point(12, 12);
    this.playlist.Name = "playlist";
    this.playlist.Size = new System.Drawing.Size(229, 316);
    this.playlist.DataSource = trackList;
}

private void playlist_add_Click(object sender, EventArgs e)
{
    //Initialize OpenFileDialog
    OpenFileDialog opd = new OpenFileDialog();
    opd.Filter = "Music (*.WAV; *.MP3; *.FLAC)|*.WAV;*.MP3;*.FLAC|All files (*.*)|*.*";
    opd.Title = "Select Music";
    opd.Multiselect = true; …
Run Code Online (Sandbox Code Playgroud)

c# listbox winforms

4
推荐指数
1
解决办法
5793
查看次数

排序时ListView闪烁

我有一个继承的列表视图,当我点击列标题时有明显的闪烁.列表在详细信息视图中.

    public ListViewEx()
    {
        this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true);
        this.DoubleBuffered = true;
    }

    int sortColumn = -1;
    protected override void OnColumnClick(ColumnClickEventArgs e)
    {
        if(e.Column != sortColumn)
        {
            sortColumn = e.Column;
            this.Sorting = SortOrder.Ascending;
        }
        else
        {
            if(this.Sorting == SortOrder.Ascending)
                this.Sorting = SortOrder.Descending;
            else
                this.Sorting = SortOrder.Ascending;
        }
        this.Sort();
    }
Run Code Online (Sandbox Code Playgroud)

填充列表时没有闪烁.

        for(int i = 0; i < 10; i++)
        {
            ListViewItem lvi = new ListViewItem("this is column 1 " +i);
            lvi.SubItems.Add("...
            lvi.SubItems.Add("...
            lvi.SubItems.Add("...
            lvi.SubItems.Add("...
            lvi.SubItems.Add("...

            listViewEx1.Items .Add (lvi);
        }
Run Code Online (Sandbox Code Playgroud)

编辑WM_ERASEBKGND并没有解决我的问题. …

listview winforms

0
推荐指数
1
解决办法
549
查看次数

标签 统计

winforms ×4

c# ×3

listview ×2

.net ×1

listbox ×1

logging ×1