【问题标题】:How to create "logging feature" in listbox in C#. Source information from other classes如何在 C# 的列表框中创建“日志记录功能”。从其他类获取信息
【发布时间】:2014-01-19 00:07:30
【问题描述】:

我在将信息从其他类“传递”到程序的主窗体时遇到问题。它是一个客户端-服务器应用程序。我想在列表框中的服务器主窗体上创建一个“日志接口”(或类似的东西,并不重要......),例如当一个客户端连接到服务器时显示。所以在我的应用程序中,它涉及两个类:Datebase.cs 和 Form.cs。当来自 database.cs 的呼叫时,我应该使用自定义文本修改 listbox1.Text。我试过 Form1.listBox1.Items.Add(logon);但它失败了:/

Database.cs

// Other classes and methods...

public class Database
{
    public string logon;
    public string logoff; 

    // some methods

    internal bool Logon(string username,string password)
    {
        // blah blah...
                logon = DateTime.Now.ToString() + " - Username " + username + " just logged on";
                Form.listBox1.Items.Add(logon);
    }
    internal bool Logoff(string username)
    {
            // blah blah...
            logoff = DateTime.Now.ToString() + " - Username " + username + " just logged off";
            Form.listBox1.Items.Add(logoff);

    }
}

而另一个类只是一个带有 listBox1 的主窗体。它设置为公共的,它在同一个命名空间中,只是不同的类。

Form.cs(设计师部分)

partial class Form
{
    private System.ComponentModel.IContainer components = null;

    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    #region Windows Form Designer generated code

    private void InitializeComponent()
    {
        this.listBox1 = new System.Windows.Forms.ListBox();
        this.SuspendLayout();
        // 
        // listBox1
        // 
        this.listBox1.AllowDrop = true;
        this.listBox1.FormattingEnabled = true;
        this.listBox1.Items.AddRange(new object[] {
        "Blah blah...",
        "BLAH BLAH!"});
        this.listBox1.Location = new System.Drawing.Point(12, 78);
        this.listBox1.Name = "listBox1";
        this.listBox1.ScrollAlwaysVisible = true;
        this.listBox1.SelectionMode = System.Windows.Forms.SelectionMode.MultiSimple;
        this.listBox1.Size = new System.Drawing.Size(429, 329);
        this.listBox1.TabIndex = 1;
        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(532, 465);
        this.Controls.Add(this.listBox1);
        this.Name = "Form1";
        this.Text = "Form1";
        this.ResumeLayout(false);

    }

    #endregion

    public System.Windows.Forms.ListBox listBox1;

【问题讨论】:

    标签: c# listbox


    【解决方案1】:

    您需要将Form 实例传递给Database,或者最好不要从Database 类更新列表框。将更新 UI(本例中为列表框)的责任留给 Form。让Form读取Logon/Logoff函数的返回值,并相应更新Listbox

    private Database _database = new Database();
    
    private void LogonButton_Click(object sender, EventeArgs e)
    {
        var logonResult = _database.Logon("username", "password");
        if(logonResult) 
        {
            logon = DateTime.Now.ToString() + " - Username " + username + " just logged on";
            listBox1.Items.Add(logon);
        }
    }
    

    下面演示了将Form 实例传递给Database 的第一种方法进行比较(不推荐):

    public class Database
    {
        ....
        public Form FormInstance;
    
        public Database(Form formInstance)
        {
            ....
            FormInstance = formInstance;
            ....
        }
        ....
        internal bool Logon(string username,string password)
        {
            // blah blah...
            logon = DateTime.Now.ToString() + " - Username " + username + " just logged on";
            FormInstance.listBox1.Items.Add(logon);
        }
        .....
    }
    
    //in Form, when creating Database instance pass current Form instance as parameter
    private Database _database;
    public Form()
    {
        ....
        _database = new Database(this);
        ....
    }
    

    【讨论】:

    • 感谢您的回复。我相信这对比我更高级的人会很有帮助……我是 C# 的初学者。老实说,在这种特殊情况下,我真的不明白它是如何与所有这些“实例”类型的东西一起工作的。所以我没有尝试你的第二种解决方案,但我对你的第一种方法思考了很多。
    • "将更新UI(本例中为Listbox)的责任留给Form。让Form读取Logon/Logoff函数的返回值,并相应地更新Listbox。"那会很棒,但是如何实现呢?在单击登录后的代码中,您将用户名和密码传递给数据库的“实例”,然后在您单击的此表单上更新它的列表框。我相信您认为它是另一种客户端-服务器,而带有列表框的表单来自连接到服务器的客户端,不,它不是:P
    • 客户端是一个完全独立的应用程序,它使用 Database.cs 表单服务器应用程序。所以 Button_Click 方法不起作用,但它仍然是我学习的好方法。当客户端连接到服务器的 Database.cs 时,我需要一些可以更新服务器表单上的 UI 的东西。整个问题在于它被设计成一个控制台应用程序,所有的“调用”都只是 Console.Writeline("blah blah");我现在需要从头开始创建这个用户界面,但我仍然没有找到任何可以得到那个“尤里卡”时刻的答案......澄清所有事情:
    • 客户端应用程序通过http连接到服务器,然后它使用服务器的Database.cs的Logon方法并且......它应该在服务器的UI上“看到”,在这种情况下是一个列表框。抱歉 4 cmets,但太长了:P
    • 我不认为您的表单到数据库的关系是客户端-服务器,我认为它是单个应用程序中的两个类。我的解决方案是回答“哪个逻辑应该在哪个类中”。第一个代码块(第一个解决方案)都驻留在 Form 中,假设您在 Form 中有一个按钮,并且当它单击 LogonButton_Click 时调用事件处理程序。我仍然不明白为什么它不起作用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多