为db中找到的每一行创建一个选项卡

时间:2014-10-04 16:31:10

标签: c# tabs oledb

我有一个查询从我的数据库中选择一个表格并在某些标签上显示它,但如果查询找到更多的一个数据行,它必须在表单的不同选项卡中显示它们中的每一个,我怎么能存档这个。

代码:

try
{
    mycon.Open();

    string querieslabels = "Select *From Alerts where State = @state && Lv =@lv";

    oleDbCmd = new OleDbCommand(querieslabels, mycon);

    oleDbCmd.Parameters.Add("@state", OleDbType.VarChar, 10).Value = "Open";
    oleDbCmd.Parameters.Add("@lv", OleDbType.VarChar, 2).Value = "1";

    OleDbDataReader read1;

    read1 = oleDbCmd.ExecuteReader();

    read1.Read();

    state = read1[4].ToString();

    if (state != "Closed")
    {
        lblNum.Text = read1[0].ToString();
        lblpress.Text = read1[1].ToString();
        txtDescription.Text = read1[2].ToString();
        lblDate.Text = read1[3].ToString();

        lblOk.Visible = false;
        pictureBox2.Visible = false;
        mycon.Close();
    }
    else
    {
        //Hides labels and other control's
        MakeNotVisible();

        MessageBox.Show("No alert found");
    }
    catch (Exception error)
    {
        MessageBox.Show(error.ToString());
    }
    finally 
    { 
        mycon.Close(); 
    }
}

我尝试创建的是一些警报系统,如果有超过1个警报,它应该显示在不同的选项卡中。有人可以指导我解决此问题,任何帮助或建议都表示赞赏。

注意:我使用Win Form。

2 个答案:

答案 0 :(得分:2)

您可以创建UserControl,其代码可以显示DataTable中的一条记录。然后,您可以创建TabPages并为每个行添加一个新的UC。注意不要添加太多页面,比如不要超过10-15页!

更新我刚刚注意到您使用的是DataReader,而不是DataTable。没问题,同样的解决方案也会在这里解决:使用添加的ShowReader方法并调用它如下所示..!

以下是一个例子:

public partial class DataForm : UserControl
{
    public DataTable theTable { get; set; }

    public DataForm()
    {
        InitializeComponent();
    }

     public int  showTableRow(int rowIndex)
     {
         if (theTable == null) return -1;
         if (theTable.Rows.Count < rowIndex) return -2;

         DataRow row = theTable.Rows[rowIndex];
         label1.Text = row[0].ToString();
         label2.Text = row[1].ToString();
         label3.Text = row[2].ToString();

         return 0;
     }

    public void showReaderRow(OleDbDataReader DR)
    {
        label1.Text = DR[0].ToString();
        label2.Text = DR[1].ToString();
        label3.Text = DR[2].ToString();
    }
}

为了便于访问,我们会保留一个列表:

List<DataForm> theDataPages = new List<DataForm>();

现在,我们可以从Tab的记录中将DataForm页面添加到tabFormPages控件DataTable;在这里我将数字限制为5:

for (int r = 0; r < DTL.Rows.Count && r < 5; r++)
{
    TabPage page = new TabPage( (r+1).ToString("Record #0" ));
    DataForm aForm = new DataForm();
    aForm.theTable = DTL;
    aForm.Parent = page;
    aForm.showTableRow(r);
    tabFormPages.TabPages.Add(page);
    theDataPages.Add(aForm);
}

DataReader一起使用时,您可以编写如下的读取循环:

while (DR.Read()) 
{
    TabPage page = new TabPage("Alert #" 
                 + (tabFormPages.TabPages.Count+1).ToString());
    DataForm aForm = new DataForm();
    aForm.Parent = page;
    aForm.showReaderRow(DR);
    tabFormPages.TabPages.Add(page);
    theDataPages.Add(aForm);
} 

首先,将类添加到项目中:Add - Add Usercontrol

现在您可以在Designer中打开它并输入您需要的所有Labels以及放置代码。同时充实showRow方法,以便在Labels ..

中正确显示您的数据

现在,您可以像我上面的TabPages一样将此类UC添加到Tab

如果您使用DataTable,还可以通过再次致电showRow让一页显示某条记录:

theDataPages[0].showRow(DTL.Rows.Count - 1);

这将显示第一个TabPage中的最后一条记录。

如果您确实需要访问该UC上的字段,您可以为这些字段创建公共属性并按如下方式访问它们:

    public DataTable theTable { get; set; }
    public Label Label1 { get; set; }
    //..

    public DataForm()
    {
        InitializeComponent();
        Label1 = label1;
        //..
    }

现在您可以访问字段:

    if (theDataPages[0].Label1.Text == "Hiho" 
        theDataPages[0].Label1.BackColor = Color.Green;

答案 1 :(得分:1)

您使用的是WinForms应用程序还是WebForms应用程序?您可能需要一个Accordion控件(http://www.codeproject.com/Articles/416521/Easy-WinForms-Accordion-Control)或一个Tab控件(http://www.c-sharpcorner.com/UploadFile/mahesh/C-Sharp-tabcontrol/)或类似的东西。您可以根据结果中的行数动态创建其中的选项卡。