【问题标题】:how to create Grid view with customized column from different table with asp.net and c#?如何使用asp.net和c#从不同的表中创建自定义列的网格视图?
【发布时间】:2012-03-14 05:37:55
【问题描述】:

现在我对如何使用以下结构和标准创建 gridview 感到非常困惑:

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

列: 1. IDcol 唯一值,它将来自tableA(作为文本) 2.日期也将来自tableA(作为文本) 3. link1 它将是指向另一个页面的超链接,并且 url 的参数将是 'IDcol' 列值,但如果该记录存​​在于 tableB 中且具有相同的 'IDcol',则显示的文本将发生变化,显示的将是“查看/编辑" 如果不存在,它将是"添加新"

数据库结构:

表A:

IDcol as (primary key),
Date

表B:

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

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

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


我的删除部分代码:

        <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();

    }

当我单击删除链接删除行时,它可以工作,但是当刷新页面时,它删除另一行而不单击删除链接,为什么会发生这种情况??

【问题讨论】:

  • 只是一个建议,当您需要循环检查某些条件时,为什么不将所有列放入一个表中
  • 因为我只需要为用户显示特定的列,这将取决于来自许多表的数据库中的数据,而不仅仅是一个,这就是问题
  • 我的意思是当你根据你的条件循环时,将所需的值添加到一个主表中(你可以在尽可能多的表中查找),然后将数据推送到所需的单元格中(希望您将要显示的列固定)
  • 嗯我想我会尝试你的建议并告诉:) 谢谢
  • @speciallife - 你有没有尝试过?

标签: c# asp.net gridview


【解决方案1】:

无论您使用多少表在 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 从所有表中获取所需的数据,但是,您仍然可以通过任何其他您觉得合适的方式获取它们

【讨论】:

  • 非常感谢您的回复和回答,我使用 sqldatasource 进行了编辑,然后对 OnRowDataBound 中的内容进行了编辑,您的建议也很好,谢谢 :) 但我现在刷新时删除命令有另一个问题页面事件 OnRowDeleting 再次触发并删除另一行而不点击删除链接我自己可以帮我吗??
  • 好的,我将向您展示我的此页面代码,也许我犯了大错误:D
  • 现在再次检查我的问题,请我添加要删除的部分:) 提前谢谢
  • 我想知道您如何以及在何处绑定数据?!你如何执行删除?我注意到您说您使用的是 SqlDataSource,如果是这样,删除应该非常容易,只需将 DeleteCommand 添加到 SqlDataSource 并且不需要 OnDeleting 或 OnDeleted。 :SqlDataSource> 让我知道结果。如果这解决了您的问题,请不要忘记将问题标记为已回答。
  • 根本不需要GridView1_RowDeleting,如果你愿意,你可以让它空着代码。只需添加 CommandDelete 和 CommandField 如我之前的评论或您的 LinkBut​​ton 所示,将 UserName=@Username 替换为 ID=@ID
【解决方案2】:

从两个表创建一个数据视图并将网格绑定到它。在渲染 GridView 时,在行事件中,即。 rowbound,你可以提出你的条件。

【讨论】:

    【解决方案3】:

    如果我做对了,您想从多个表中选择一些列(如 A、B、C),然后在 gridview 中显示它们。如果是,它可以通过各种方式完成。 1. 创建一个自定义DataSet,其中包含您所需的数据列,并使用选择查询填充它。然后将数据集绑定到gridview。 2. 创建一个DataTable,其中包含您所需的数据列,并使用选择查询填充它。然后将表格绑定到gridview中。 3.将您需要的列直接添加到gridview中,然后使用循环在其中添加数据项。 注意:在任何情况下,UNCHECK网格视图的“AutoGenerateColumn”选项以确保顺利运行。

    【讨论】:

    • 是的,你是对的,我想尝试你的第三个建议,因为它可以满足我检查某些条件的需要
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多