【问题标题】:How to have two columns with the same field but different values in a GridView如何在 GridView 中有两列具有相同的字段但不同的值
【发布时间】:2017-08-30 20:47:45
【问题描述】:

我目前正在 ASP.NET/C# 中做一个项目,其中有一个 GridView,它从两个不同的表中获取两种类型的数据,ID 和 Initials。

表格本身必须是这样的:


单元 1

ID - 首字母


旁边还有一个专栏:


单元 2

ID - 首字母


ID 是从表 2 中调用的,而首字母是从表 1 中调用的。每个 ID 都有自己的首字母,但我的问题是,由于首字母被调用了两次,因此它们在以下内容中重复,并且以前的专栏,见here

我当前的代码(ASPX):

<asp:GridView ID="GridView1" runat="server" CssClass= "table table-hover table-bordered" AllowPaging="false" PageSize="4" OnPageIndexChanging="OnPaging" OnPageIndexChanged="SearchByTagButton_Click" Style="max-width:75%;" AutoGenerateColumns="false">
                <Columns>
                    <asp:TemplateField HeaderText="UNIDADE" HeaderStyle-ForeColor="#B70700" HeaderStyle-Width="34%">
                        <ItemTemplate>
                            <%# DataBinder.Eval(Container.DataItem, "unidade")%>
                            -
                            <%# DataBinder.Eval(Container.DataItem, "sigUnidade")%>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="UNIDADE APOIADA" HeaderStyle-ForeColor="#B70700" HeaderStyle-Width="34%">
                        <ItemTemplate>
                            <%# DataBinder.Eval(Container.DataItem, "unidadeApoiada")%>
                            -
                            <%# DataBinder.Eval(Container.DataItem, "sigUnidade")%>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>

和 C#:

SqlDataAdapter da;
    DataSet ds1 = new DataSet();
    DataSet ds2 = new DataSet();    
SqlConnection conn = new SqlConnection(strConn);

    da = new SqlDataAdapter("SELECT ts.unidade, u.sigUnidade FROM T_SECRETARIAS ts INNER JOIN UNIDADES u on u.unidade = ts.unidade WHERE '%" + txtCodigoSearch.Text + "%' IS NULL OR LEN('%" + txtCodigoSearch.Text + "%') = 0 OR (ts.unidade='%" + txtCodigoSearch.Text + "%') OR ts.unidade LIKE '%" + txtCodigoSearch.Text + "%'", conn);
    da.Fill(ds1);
    da = new SqlDataAdapter("SELECT ts.unidadeApoiada, u.sigUnidade FROM T_SECRETARIAS ts INNER JOIN UNIDADES u on u.unidade = ts.unidadeApoiada WHERE '%" + txtCodigoSearch.Text + "%' IS NULL OR LEN('%" + txtCodigoSearch.Text + "%') = 0 OR (ts.unidadeApoiada='%" + txtCodigoSearch.Text + "%') OR ts.unidadeApoiada LIKE '%" + txtCodigoSearch.Text + "%'", conn);
    da.Fill(ds2);
    ds1.Merge(ds2);
    GridView1.DataSource = ds1;
    GridView1.DataBind();

我基本上加入了两个数据集,每个 SQL 查询一个,因为我发现这是加入两个查询以获得两个 ID 的唯一方法(它们是不同的,因为它们都是表 1 中的“主 ID” ,但在表 2 中它们也可以是“子 ID”。

我试图解释我最好的,但希望我的表格被格式化为 ID - INITIALS 而没有任何重复。如果我能得到任何帮助,我将不胜感激。

【问题讨论】:

  • 如果2个数据集没有任何关系,那么为每列创建1个gridview?
  • 首先你必须在查询中使用参数而不是连接:OR (ts.unidade='%" + txtCodigoSearch.Text + "%')变成OR ts.unidate = @myParameter
  • 现在的问题是为什么两个 unidades 在同一条线上?我认为对于 unidade.id,所以也许您只能执行一个查询并拥有 3 个模板字段:sigUnidade、unidade、unidadeApoiada。
  • @TriV 这是我最初的想法,给我任务的人希望在一个网格视图中完成所有操作。
  • @Emanuele 对不起,我不明白第一部分。同一条线上的两个unidades?我的主要问题是获取 unidade 和 unidadeApoiada 的首字母 (sigUnidade),而不是让它们重复。

标签: c# mysql asp.net sql-server gridview


【解决方案1】:

从cmets开始,可以有如下代码:

SqlDataAdapter da;
DataSet ds1 = new DataSet(); 
SqlConnection conn = new SqlConnection(strConn);

da = new SqlDataAdapter("SELECT ts.unidade, ts.unidadeApoiada, u1.sigUnidade as sigUnidade1, u2.sigUnidade as sigUnidade2 FROM T_SECRETARIAS ts INNER JOIN UNIDADES u1 on u1.unidade = ts.unidade INNER JOIN UNIDADES u2 on u2.unidade = ts.unidadeApoiada WHERE....", conn);
da.Fill(ds1);
GridView1.DataSource = ds1;
GridView1.DataBind();

在 aspx 中:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
            <Columns>
                <asp:TemplateField HeaderText="UNIDADE">
                    <ItemTemplate>
                        <%# DataBinder.Eval(Container.DataItem, "unidade")%>
                        -
                        <%# DataBinder.Eval(Container.DataItem, "sigUnidade1")%>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="UNIDADE APOIADA">
                    <ItemTemplate>
                        <%# DataBinder.Eval(Container.DataItem, "unidadeApoiada")%>
                        -
                        <%# DataBinder.Eval(Container.DataItem, "sigUnidade2")%>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>

【讨论】:

    【解决方案2】:

    只使用一个查询 UNION 怎么样。 所以你会有 选择 ts.unidade , u.sigUnidade 从 T_SECRETARIAS ts INNER JOIN UNIDADES .. 联盟 SELECT ts.unidadeApoiada as unidas, u.sigUnidade FROM T_SECRETARIAS ts INNER JOIN ...

    您必须对两个查询的输出使用相同的名称

    【讨论】:

    • 最后说“System.Web.HttpException: DataBinding: 'System.Data.DataRowView' 不包含名为 'unidadeApoiada' 的属性。”
    • 如果数据不相关,此解决方案有效。你从aspx派生的错误,你必须在unidade中更改unidadeApoiada。
    【解决方案3】:

    您只需创建一个像电话号码这样的列,我认为这是您问题的完美示例。我也在尝试解决这些类型的错误。这就是我告诉你使用这段代码的原因。我希望它对你有用。这是将多个文本框值合并到gridview中的单个单元格的示例代码。

    protected void Button1_Click(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection(@"Data Source=RVM\SQLEXPRESS;Initial Catalog=rvm;Persist Security Info=True;User ID=sa;Password=rvmbecse");
        string str = "insert into multext values('"+TextBox1.Text +" , " + TextBox2.Text + "')";
        con.Open();
        SqlCommand cmd = new SqlCommand(str,con);
        cmd.ExecuteNonQuery();
        con.Close();
        GridView1.DataBind();
        //Response.Write("<script>alert('HI RVM Data inserted Successfully')</script>");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2020-02-02
      • 1970-01-01
      相关资源
      最近更新 更多