1

最初の列にGridView3 つのセットで冗長データが表示される があります。コードのインスタンスが 1 つだけ表示されるように、この冗長性を排除する必要があります。

GridView外観は次のとおりです。

A1234 | Total Entries                  | 1    | 7   |     |                   
A1234 | Equipment Entries              | 1    | 7   |     |                 
A1234 | Total Repair Time              | 60   | 140 |     |                   
B9876 | Total Entries                  | 87   | 36  | 14  | 
B9876 | Equipment Entries              | 87   | 36  | 143 | 
B9876 | Total Repair Time              | 2070 | 790 | 370 |   
C3456 | Total Entries                  | 1    |     |     |        
C3456 | Equipment Entries              | 1    |     |     |       
C3456 | Total Repair Time              | 190  |     |     | 

私がそれをどのように見せたいかというと(そして、適切にフォーマットすることができないようです)、最初の列で、コード A1234、B9876、および C3456 が、表示されているように 3 回ではなく 1 回だけ表示されるようにすることです。黒いスペース/セル。

私が持っている最新のコードは基本的にこれです:

protected void gvMetrics_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {   
        DataRow _data = ((DataRowView)e.Row.DataItem).Row;

        // _lastCode is a clas level variable
        if (_lastCode.ToString() != _data.ItemArray[0].ToString())
        {
            if (_totals == 1)
            {
                _lastCode = _data.ItemArray[0].ToString();
                e.Row.Cells[0].Text = _data.ItemArray[0].ToString();
               _totals++;
            }  
         }
         else
          _totals = 1; // Class level variable initialized to 1.
     }
 }

何らかの理由でコードをフォーマットできませんが、画像は取得できます。ここでの私の推論は、コードをクラス変数に割り当て、各OnRowDataBaoundイベントで値が現在のセルと一致するかどうかを確認するということです。GridView一致する場合は、 /pageへの書き込みをスキップします。それは機能しなかったので、3 回目のイベントの後に 1 にリセットされるカウンターを使用できると考えましたが、これも機能しませんでした。

私はとても近くにいるように感じますが、葉巻はありません!太陽の下でこれは何も新しいことではないと思うので、親切に解決策を提案できる人がいれば、それを大いに感謝します!

4

1 に答える 1

2

これを行う最善の方法は、最初の列を にし、実装されたイベントTemplateFieldで を追加することです。LiteralOnDataBinding

例:

<asp:TemplateField>
    <ItemTemplate>
        <asp:Literal ID="ltYourField" runat="server"
            OnDataBinding="ltYourField_DataBinding" />
    </ItemTemplate>
</asp:TemplateField>

次に、.cs コードビハインドで:

// Create a global to store last value found for the field
string _lastValueDisplayed = string.Empty;

以下を実装しOnDataBindingます。

protected void ltYourField_DataBinding(object sender, System.EventArgs e)
{
    Literal lt = (Literal)sender;
    string displayValue = Eval("yourFieldNameFromResult").ToString();
    lt.Text = _lastValueDisplayed.Equals(displayValue) ?
        string.Empty : displayValue;
    // store value for checking on next row
    _lastValueDisplayed = displayValue;
}

OnRowDataBoundコードでコントロールを探す必要があるため、 でバインディングを行わないようにしてください。代わりに OnDataBinding を使用して問題のコントロールに機能を関連付けると、コードのスコープが目的のコントロールに限定され、検索が行われなくなります。

于 2013-02-01T21:47:54.483 に答える