当前位置: 代码网 > it编程>编程语言>Asp.net > C#表格开发之DataGridView控件详解

C#表格开发之DataGridView控件详解

2024年12月30日 Asp.net 我要评论
一、概要使用datagridview控件,您可以显示和编辑来自许多不同类型数据源的表格数据。datagridview控件为显示数据提供了一个可定制的表格。datagridview类允许通过使用defa

一、概要

使用datagridview控件,您可以显示和编辑来自许多不同类型数据源的表格数据。

datagridview控件为显示数据提供了一个可定制的表格。datagridview类允许通过使用defaultcellstyle、columnheadersdefaultcellstyle、cellborderstyle和gridcolor等属性来定制单元格、行、列和边框。

无论有或没有底层数据源的数据,你都可以在使用datagridview控件显示出你所期望显示的数据。

如果没有指定的数据源,你可以创建包含数据的rows和coumns,并使用datagridview类里的rowscolumns属性将它们直接添加到datagridview控件中。您可以使用rows集合来访问datagridviewrow对象,也可以使用datagridviewrow.cell属性直接读取或写入单元格值。另外,还有 item[] 索引器提供了对单元格的直接访问。

您可以设置datasourcedatamember属性,以将datagridview控件绑定到数据源并自动向其填充数据,这种方法可以做为手动填充数据的替代方法。但是前提条件是必须有指定的数据源。

当处理大量数据时,可以将virtualmode属性设置为true,以显示可用数据的子集。虚拟模式需要实现数据缓存,从中填充datagridview控件。

二、手动填充数据

1、如何手动填充数据

下面的代码示例演示如何创建一个未绑定的datagridview;设置columnheadersvisiblecolumnheadersdefaultcellstylecolumncount属性;并使用rows属性和columns属性。

它还演示了如何使用autoresizecolumnheadersheight()autoresizerows()方法的一个版本,来适当地调整列标头和行的大小。

要运行此示例,请将以下代码粘贴到包含名为datagridview1的datagridview和名为button1的button的表格中,然后从表格的构造函数或load事件处理程序调用initializedatagridview()方法。确保所有事件都与其事件处理程序相连接。

public form1()
{
	initializecomponent();
	initializedatagridview();

}
private void initializedatagridview()
{
    // create an unbound datagridview by declaring a column count.
    datagridview1.columncount = 4;
    datagridview1.columnheadersvisible = true;

    // set the column header style.
    datagridviewcellstyle columnheaderstyle = new datagridviewcellstyle();

    columnheaderstyle.backcolor = color.beige;
    columnheaderstyle.font = new font("verdana", 10, fontstyle.bold);
    datagridview1.columnheadersdefaultcellstyle = columnheaderstyle;

    // set the column header names.
    datagridview1.columns[0].name = "recipe";
    datagridview1.columns[1].name = "category";
    datagridview1.columns[2].name = "main ingredients";
    datagridview1.columns[3].name = "rating";

    // populate the rows.
    string[] row1 = new string[] { "meatloaf", "main dish", "ground beef", "**" };
    string[] row2 = new string[] { "key lime pie", "dessert", "lime juice, evaporated milk", "****" };
    string[] row3 = new string[] { "orange-salsa pork chops", "main dish", "pork chops, salsa, orange juice", "****" };
    string[] row4 = new string[] { "black bean and rice salad", "salad", "black beans, brown rice", "****" };
    string[] row5 = new string[] { "chocolate cheesecake", "dessert",  "cream cheese", "***" };
    string[] row6 = new string[] { "black bean dip", "appetizer",  "black beans, sour cream", "***" };
    object[] rows = new object[] { row1, row2, row3, row4, row5, row6 };

    foreach (string[] rowarray in rows)
    {
        datagridview1.rows.add(rowarray);
    }
}

private void button1_click(object sender, system.eventargs e)
{
    // resize the height of the column headers. 
    datagridview1.autoresizecolumnheadersheight();

    // resize all the row heights to fit the contents of all non-header cells.
    datagridview1.autoresizerows( datagridviewautosizerowsmode.allcellsexceptheaders);
}

private void initializecontextmenu()
{
    // create the menu item.
    toolstripmenuitem getrecipe = new toolstripmenuitem("search for recipe", null,
        new system.eventhandler(shortcutmenuclick));

    // add the menu item to the shortcut menu.
    contextmenustrip recipemenu = new contextmenustrip();
    recipemenu.items.add(getrecipe); 

    // set the shortcut menu for the first column.
    datagridview1.columns[0].contextmenustrip = recipemenu;
    datagridview1.mousedown += new mouseeventhandler(datagridview1_mousedown);
}

private datagridviewcell clickedcell;

//当鼠标指针位于控件上并按下鼠标键时发生。
private void datagridview1_mousedown(object sender, mouseeventargs e)
{
// if the user right-clicks a cell, store it for use by the shortcut menu.
    if (e.button == mousebuttons.right)
    {
        datagridview.hittestinfo hit = datagridview1.hittest(e.x, e.y);
        if (hit.type == datagridviewhittesttype.cell)
        {
            clickedcell =
                datagridview1.rows[hit.rowindex].cells[hit.columnindex];
        }
    }
}

private void shortcutmenuclick(object sender, system.eventargs e)
{
    if (clickedcell != null)
    {
        //retrieve the recipe name.
        string recipename = (string)clickedcell.value;

        //search for the recipe.
        system.diagnostics.process.start(
            "http://search.msn.com/results.aspx?q=" + recipename);
            //null);
    }
}

上述代码中,先创建数个字符串数组,数组的元素数量等于datagridview1的列的数量。然后在循环中,调用datagridview1.rows.add(rowarray);方法,将数组元素填充进datagridview1的某行中。

2、如何插入一行数据

如果你想要向datagridview表格中插入一行数据,可以使用下面代码:

this.datagridview1.rows.insert(0, "one", "two", "three", "four");

该行代码表示向datagridview1中插入一条数据到第0行。

如果你想要插入一行空的单元格,可以使用下列代码:

this.datagridview1.rows.insert(0, "", "", "", "");

rows属性,不但包括值,还包括样式信息。因此,你可以根据已设置样式的现有行添加或插入行,这时,你可以使用addcopy()、addcopies()、insertcopy()insertcopies()方法来做到这一点。

你还可以使用rows集合修改控件中的值或删除行。无论控件是否绑定到外部数据源,都可以修改值或删除行。如果存在数据源,则直接对数据源进行更改。但是,您可能仍然需要将数据源更新推送到远程数据库。

3、如何修改单元格值

下面的示例向您展示如何以编程方式修改单元格值。

// modify the value in the first cell of the second row.  
this.datagridview1.rows[1].cells[0].value = "new value";  

// the previous line is equivalent to the following line.  
this.datagridview1[0, 1].value = "new value";

除了标准集合功能之外,您还可以使用rows集合来检索行信息。例如,你可以使用getrowstate()方法确定特定行的状态,也可以使用getrowcount()getrowsheight()方法来确定特定状态下的行数或行的组合高度。

如果你要检索具有特定状态的行索引,可以使用getfirstrow()getlastrow()getnextrow()getpreviousrow()方法。

下面的示例向您展示如何检索第一个选定行的索引,然后使用它以编程方式删除该行。

int32 rowtodelete = this.datagridview1.rows.getfirstrow(datagridviewelementstates.selected);  
if (rowtodelete > -1)  
{  
    this.datagridview1.rows.removeat(rowtodelete);  
}

上述代码,是在选定某些行的时候,删除选中行里的第一行。注意:选中行时是包含行头在内。如下图所示 :

为了提高性能,rows属性返回的datagridviewrowcollection可以包括共享行和非共享行。共享行共享内存,以减少大型记录集的成本。如果您的记录集非常大,那么在访问rows属性时应该小心地尽可能多地保持行共享。

三、datagridview控件绑定数据源

1、概述

datagridview控件支持标准的windows窗体数据绑定模型,因此它可以绑定到各种数据源。通常,您绑定到管理与数据源交互的bindingsource。bindingsource可以是任何windows窗体数据源,这在选择或修改数据位置时为您提供了极大的灵活性。

将数据绑定到datagridview控件是直接和直观的,在许多情况下,它就像设置datasource属性一样简单。当绑定到包含多个列表或表的数据源时,请将datamember属性设置为指定要绑定到的列表或表的字符串。

datagridview控件支持标准的windows窗体数据绑定模型,因此它将绑定到以下列表中描述的类的实例:

  • 实现ilist接口的任何类,包括一维数组。
  • 实现ilistsource接口的任何类,例如datatable和dataset类。
  • 任何实现ibindinglist接口的类,例如bindinglist<t>类。
  • 任何实现ibindinglistview接口的类,比如bindingsource类。

datagridview控件支持将数据绑定到这些接口返回的对象的公共属性,或者绑定到icustomtypedescriptor接口返回的属性集合(如果在返回的对象上实现的话)。

通常,您将datagridview绑定到一个bindingsource组件,并将bindingsource组件绑定到另一个数据源,或者用业务对象填充它。

bindingsource组件是首选的数据源,因为它可以绑定到各种各样的数据源,并且可以自动解决许多数据绑定问题。

2、将datagridview绑定到bindingsource

连接datagridview控件到data的步骤:

  • 实现一个方法来处理检索数据的细节。下面的代码示例实现了一个getdata方法,该方法初始化一个sqldataadapter,并使用它来填充一个datatable。然后将datatable绑定到bindingsource。
  • 在form的load事件处理程序中,将datagridview控件绑定到bindingsource,并调用getdata方法来检索数据。

用您的northwind sql server示例数据库连接的值填充示例中的connectionstring变量。windows身份验证,也称为集成安全,是一种比在连接字符串中存储密码更安全的连接数据库的方式。

下列完整的代码演示了从数据库中检索数据,并填充到windows窗体中的datagridview控件。form还有一些button用于重新加载数据和向数据库提交更改。

using system;
using system.data;
using system.data.sqlclient;
using system.globalization;
using system.windows.forms;

namespace windowsformsapp
{
	public class bindsourceform1 : form
{
    private datagridview datagridview1 = new datagridview();
    private bindingsource bindingsource1 = new bindingsource();
    private sqldataadapter dataadapter = new sqldataadapter();
    private button reloadbutton = new button();
    private button submitbutton = new button();


    // initialize the form.
    public form1()
    {
		initializecomponent();
		
        datagridview1.dock = dockstyle.fill;

        reloadbutton.text = "reload";
        submitbutton.text = "submit";
        reloadbutton.click += new eventhandler(reloadbutton_click);
        submitbutton.click += new eventhandler(submitbutton_click);

        flowlayoutpanel panel = new flowlayoutpanel
        {
            dock = dockstyle.top,
            autosize = true
        };
        panel.controls.addrange(new control[] { reloadbutton, submitbutton });

        controls.addrange(new control[] { datagridview1, panel });
        load += new eventhandler(form1_load);
        text = "datagridview data binding and updating demo";
    }

    private void getdata(string selectcommand)
    {
        try
        {
            // specify a connection string.
            // replace <sql server> with the sql server for your northwind sample database.
            // replace "integrated security=true" with user login information if necessary.
            string connectionstring =
                "data source=(local);initial catalog=northwind;" +
                "integrated security=true";

            // create a new data adapter based on the specified query.
            dataadapter = new sqldataadapter(selectcommand, connectionstring);

            // create a command builder to generate sql update, insert, and
            // delete commands based on selectcommand.
            sqlcommandbuilder commandbuilder = new sqlcommandbuilder(dataadapter);

            // populate a new data table and bind it to the bindingsource.
            datatable table = new datatable
            {
                locale = cultureinfo.invariantculture
            };
            dataadapter.fill(table);
            bindingsource1.datasource = table;

            // resize the datagridview columns to fit the newly loaded content.
            datagridview1.autoresizecolumns(
                datagridviewautosizecolumnsmode.allcellsexceptheader);
        }
        catch (sqlexception)
        {
            messagebox.show("to run this example, replace the value of the " +
                "connectionstring variable with a connection string that is " +
                "valid for your system.");
        }
    }

    private void form1_load(object sender, eventargs e)
    {
        // bind the datagridview to the bindingsource
        // and load the data from the database.
        datagridview1.datasource = bindingsource1;
        getdata("select * from customers");
    }

    private void reloadbutton_click(object sender, eventargs e)
    {
        // reload the data from the database.
        getdata(dataadapter.selectcommand.commandtext);
    }

    private void submitbutton_click(object sender, eventargs e)
    {
        // update the database with changes.
        dataadapter.update((datatable)bindingsource1.datasource);
    }
}
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com