动态添加按钮后,从另一个表单更新winform c#

时间:2016-10-12 11:48:39

标签: c# winforms

我正在研究c#WinForms中的原型项目,该项目有3种形式,如下所示:

enter image description here

1-MasterForm 2-Layout 3-UpdateLayout 我的数据库中也有一个表,该表只有2列一个用于layout_no,另一个用于layout_status。如果布局繁忙,我需要将其颜色更改为红色,如果不忙,我会将其保持为绿色。

我将布局更新为忙后的问题是,它不会在MasterForm中刷新。

这是我的UpdateLayout表格代码:

public void refreshLayout()
{
    try
    {
        using (SQLiteConnection con = new SQLiteConnection(ConnectToDB))
        {
            con.Open();
            using (SQLiteDataAdapter da = new SQLiteDataAdapter("SELECT layout_no, is_busy FROM layout_table", con))
            {
                DataTable dt = new DataTable();
                da.Fill(dt);
                int totalrows = dt.Rows.Count;
                for (int i = 0; i < totalrows; i++)
                {
                    int status = Convert.ToInt32(dt.Rows[i]["is_busy"]);
                    Button ButtonAllLayout = new Button();
                    ButtonAllLayout.Name = "Layout'" + (i + 1) + "'";
                    ButtonAllLayout.Text = dt.Rows[i]["Layout_no"].ToString();
                    styleButton();//apply the button location...etc
                    this.Controls.Add(ButtonAllLayout);
                    if (status == 1)
                    {
                        ButtonAllLayout.BackColor = Color.Red;
                    }
                    else
                    {
                        ButtonAllLayout.BackColor = Color.YellowGreen;
                    }
                }
            }
        }
    }
    catch (Exception)
    {
        throw;
    }
}

private void button1_Click(object sender, EventArgs e)
{
    refreshLayout();
}

这是我MasterForm的代码:

public MasterForm()
{
    InitializeComponent();
}

private void BtnLayout_Click(object sender, EventArgs e)
{
    Layout l1 = new Layout();
    l1.refreshLayout();
    splitContainerMain.Panel2.Show();
    splitContainerMain.Panel2.Controls.Add(l1);
    l1.Show();
}

private void BtnSetting_Click(object sender, EventArgs e)
{
    Settings s1 = new Layout();
    splitContainerMain.Panel2.Show();
    splitContainerMain.Panel2.Controls.Add(s1);
    s1.Show();
}

private void BtnMain_Click(object sender, EventArgs e)
{
    Main m1 = new Main();
    splitContainerMain.Panel2.Show();
    splitContainerMain.Panel2.Controls.Add(m1);
    m1.Show();
}

你能指导我怎么做吗?

提前致谢。

3 个答案:

答案 0 :(得分:1)

首先,您应该为UpdateLayout表单提供父信息

UpdateLayout frm = new UpdateLayout();
frm.Owner = this; //Layout form
frm.Show();

之后,您可以调用布局表单的公共refreshLayout方法,

来自UpdateLayout表单的按钮事件

private void button1_Click(object sender, EventArgs e)
{
    (this.Owner as UpdateLayout).refreshLayout();
}

您还需要清除之前创建的按钮

在refreshLayout方法的开头

this.Controls.Clear();

或者实现除refreshLayout之外的新方法以仅更改已更改按钮的backColor

答案 1 :(得分:0)

据我所知,您的按钮全部添加了尺寸(0,0)和位置(0,0)。所以我认为它们在那里,但由于尺寸和位置而根本不可见。

尝试添加以下内容:

caffe io

答案 2 :(得分:0)

要将自定义BackColor应用于您的按钮,您应为UseVisualStyleBackColor = false设置ButtonAllLayout

顺便说一句,在生产代码中,在GUI线程上打开数据库连接并不是一个好主意。