如何使用asp.net和c#从不同的表中创建具有自定义列的网格视图

本文关键字:创建 自定义 视图 网格 net asp 何使用 | 更新日期: 2023-09-27 18:27:55

现在我很困惑如何创建具有以下结构和标准的网格视图:

注意:gridview将从不同的表中获取数据

列:1.IDcol是唯一的值,它将来自表A(作为文本)2.从表A开始的日期(以文本形式)3.link1它将是到另一个页面的超链接,url的参数将是"IDcol"列值,但如果该记录存在于具有相同"IDcol"的表B中,则显示的文本将发生更改,显示的将是"查看/编辑",如果不存在,则为"添加新的"

数据库结构:

表A:

IDcol as (primary key),
Date

表B:

ID,
IDcol as (foreign key from tableA).
other fields

所以我需要使用循环填充网格视图,因为我必须检查每一行并使用一些条件

很抱歉,如果我的描述方式不清楚,但我真的很困惑


我删除部件的代码:

        <asp:LinkButton ID="DeleteLink" runat="server" Text="Delete"     CommandName="Delete"></asp:LinkButton>
        </ItemTemplate>
        <ItemStyle Width="100px" />
        </asp:TemplateField>

 DeleteCommand="DELETE VisitsInfo WHERE ID=@VID">

 <DeleteParameters>
                <asp:Parameter Name="VID" Type="Int64" />
            </DeleteParameters>

代码背后:

 protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
            int VID = int.Parse(GridView1.DataKeys[0].Value.ToString());
            SqlDataSourceVisits.DeleteParameters[0].DefaultValue = VID.ToString();
    }

当我点击删除链接删除行时,它是有效的,但当刷新页面时,它删除了另一行而没有点击删除链接,为什么会发生这种情况??

如何使用asp.net和c#从不同的表中创建具有自定义列的网格视图

无论在Gridview中使用多少表来显示数据,最好且更灵活的方法都是使用OnRowDataBound。

//do some database queries to return the appropriate value
DataTable dt = new DataTable();
private void Bind()
{
    //set up the dt with all the required data from single or multiple tables
}
//Then in the page Load method, call the above Bind method
protected void Page_Load(object sender, EventArgs e)
{
     if (!IsPostBack)
     {
          Bind();
     }
}
//then do something like the following 
int idx = 0;    
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    //do some database queries to return the appropriate value, then do something like the following
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.Cells[0].Text = dt.Rows[idx][0];
        e.Row.Cells[1].Text = dt.Rows[idx][1];
        //or maybe
        ((TextBox)e.Row.Cells[0].FindControl("textBox1")).Text = dt.Rows[idx][0];
        ((Label)e.Row.Cells[1].FindControl("label2")).Text = dt.Rows[idx][1];
        ((CheckBox)e.Row.Cells[1].FindControl("chkbx1")).Selected = (bool)dt.Rows[idx][2]; 
        idx++;
    }
}

正如Pranay所说,您可能希望使用Linq和join从所有表中获取所需的数据,不过,您仍然可以通过觉得舒服的任何其他方式来获取它们

从这两个表创建一个数据视图,并将网格绑定到它。在渲染GridView时,可以在行事件(即rowbound)中设置条件。

如果我做对了,你想从多个表中选择一些列(如A、B、C),然后在gridview中显示它们。如果是这样的话,可以通过各种方式来实现。1.创建一个包含所需数据列的自定义DataSet,并使用select查询进行填充。然后将数据集绑定到gridview中。2.创建一个包含所需数据列的DataTable,并使用select查询进行填充。然后将表绑定到gridview中。3.将所需列直接添加到gridview中,然后使用循环在其中添加数据项。注意:在任何情况下,取消检查网格视图的"自动生成列"选项,以实现平稳操作。