【问题标题】:Dropdownlist based on database and to merge column when they have same ID基于数据库的下拉列表并在它们具有相同ID时合并列
【发布时间】:2022-01-16 16:35:24
【问题描述】:

我有数据库中保存的数据示例如图: list of attachments uploaded by 3 different users (STAFF_145, STAFF_143 and STAFF_147)

当我从 gridview 列表中调用它时,它显示如下: Gridview of list attachment

基于gridview,我尝试使用<asp:Label ID="txt_training_attach_name" runat="server" Text='<%# Bind("training_attach_name") %>' ReadOnly="true"> 应用“附件和TRF”列。

当我更改为“下拉列表”而不是使用“标签”或“文本框”时,它会显示错误。

System.ArgumentOutOfRangeException: ''txt_training_attach_name' 有一个 SelectedValue 无效,因为它不存在于列表中 的项目。参数名称:值'

当我使用 Dropdownlist 时,错误在这里指出:

if (dt.Rows.Count > 0)
{
     Grid_Attachment.DataSource = dt;
     Grid_Attachment.DataBind();
}

如果我想制作一个像这样显示的网格视图,有可能吗? Dropdownlist and Merge Column

自上个月以来,我尝试了很多方法,但仍然无法得到答案。感谢您能帮助我。提前谢谢你。

【问题讨论】:

  • 您需要对结果进行分组,以便员工 ID 是唯一的,并为每个下拉菜单提供一个数据源,即具有相同员工 ID 的项目的总列表

标签: c# mysql asp.net gridview drop-down-menu


【解决方案1】:

您没有提到上传文件的人员表是否与应该驱动网格的表不同。

如果是出于某种原因,则构建一个不包含文件列的 group by 查询,然后 group by,这样您就可以为每个员工提供一个 SINGLE 行。

那么,我们可以把这个放到一个网格列表中:

我将使用列表框代替组合(下拉菜单),因此它会很好地显示文件 - 如果需要,您可以将其更改为下拉菜单 - 相同的代码

所以,标记可能是这样的:

        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
            DataKeyNames="ID" CssClass="table table-hover" OnRowDataBound="GridView1_RowDataBound">
            <Columns>
                <asp:BoundField DataField="Firstname" HeaderText="First Name"  />
                <asp:BoundField DataField="LastName" HeaderText="Last Name"    />
                <asp:BoundField DataField="TrainingDate" HeaderText="Training Date"       DataFormatString="{0:yyyy-MM-dd}" />
                <asp:BoundField DataField="ApplicationDate" HeaderText="Application Date" DataFormatString="{0:yyyy-MM-dd}" />
                <asp:BoundField DataField="ProgramTitle" HeaderText="Program Title"  />
                <asp:BoundField DataField="TrainingCost" HeaderText="Training Cost"  DataFormatString="{0:c}" />

                <asp:TemplateField HeaderText="Documents Submitted">
                    <ItemTemplate>
                        <asp:ListBox ID="cboFiles" runat="server" Width="200PX"
                            DataTextField ="FileName"
                            DataValueField="FileName">                
                        </asp:ListBox>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

请注意我们如何添加列表框(如上所述,如果需要,请使用下拉菜单)。

因此,填充此 gv 的代码将是这样的:

   protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadGrid();
    }

    void LoadGrid()
    {
        GridView1.DataSource = MyRst("SELECT * from Users ORDER BY FirstName");
        GridView1.DataBind();
    }


    DataTable MyRst(string strSQL)
    {
        DataTable rstData = new DataTable();
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
            {
                conn.Open();
                rstData.Load(cmdSQL.ExecuteReader());
            }
        }

        return rstData;
    }

但是,对于每一行,我们都需要加载该行的文件列表。如前所述,我不知道您这里是否有两张桌子 - 或一张。 (但是,这真的没关系 - 如上所述,对这个主网格数据源使用 group-by。

现在,唯一额外的部分是使用 gv “行数据绑定”事件。这会在渲染期间为每一行触发,并且是加载组合框或列表框的想法事件。

代码是这样的:

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            // get PK row id (user id)
            int? PKID = GridView1.DataKeys[e.Row.RowIndex]["ID"] as int?;
            string strSQL = "SELECT FileName FROM MyFiles WHERE User_ID = " + PKID;
            DataTable rstFiles = MyRst(strSQL);
           ListBox cboFiles = e.Row.FindControl("cboFiles") as ListBox;

            cboFiles.DataSource = rstFiles;
            cboFiles.DataBind();
            cboFiles.Rows = 1;
            if (rstFiles.Rows.Count > 1)
                cboFiles.Rows = rstFiles.Rows.Count;
        }
    }

上面我确实有两列。一列是 JUST 文件名,一列是上传文件夹的完整路径名 + 文件。如果您不只有一个文件名列,那么我们可以编写一些代码来只包含 + 显示文件名。

运行上面的结果是这样的:

【讨论】:

  • 感谢您的回复。非常感谢。我会尽力解决这个问题,很快就会回复你。被告知我从另一个表中做了 gridview(我使用了 INNER JOIN)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
  • 2018-04-21
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多