لا أحد يعرف من طريقة إخفاء عمود في asp.net listview?

StackOverflow https://stackoverflow.com/questions/70758

  •  09-06-2019
  •  | 
  •  

سؤال

وأنا أعلم أنك يمكن أن تضع <% إذا %> البيانات في ItemTemplate إلى إخفاء الضوابط ولكن العمود لا يزال هناك.لا يمكنك وضع <% %> البيانات في LayoutTemplate الذي هو فيه عمود العناوين المعلنة ، ومن هنا جاءت مشكلة.لا أحد يعرف من طريقة أفضل ؟

هل كانت مفيدة؟

المحلول

هنا حل آخر أنا فقط فعلت ، نرى أن أفهم ما تريد القيام به:

وهنا ASCX / ASPX

    <asp:ListView ID="ListView1" runat="server" DataSourceID="MyDataSource" ItemPlaceholderID="itemPlaceHolder" OnDataBound="ListView1_DataBound">
        <LayoutTemplate>
            <table border="1">
                <tr>
                    <td>Name</td>
                    <td>Age</td>
                    <td runat="server" id="tdIsSuperCool">IsSuperCool</td>
                </tr>
                <asp:PlaceHolder ID="itemPlaceHolder" runat="server" />
            </table>
        </LayoutTemplate>
        <ItemTemplate>
            <tr>
                <td><%# Eval("Name") %></td>
                <td><%# Eval("Age") %></td>
                <td runat="server" id="myCol" visible='<%# (bool)Eval("IsSuperCool") %>'>true</td>
            </tr>
        </ItemTemplate>
    </asp:ListView>
    <asp:ObjectDataSource 
        ID="MyDataSource" 
        runat="server" 
        DataObjectTypeName="BusinessLogicLayer.Thing" 
        SelectMethod="SelectThings"
        TypeName="BusinessLogicLayer.MyObjectDataSource" />

هنا هو رمز وراء

/// <summary>
/// Handles the DataBound event of the ListView1 control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
protected void ListView1_DataBound(object sender, EventArgs e)
{
    ListView1.FindControl("tdIsSuperCool").Visible = false;
}

تفعل ما تريد في databound.لأن العمود هو الآن runat الخادم وأنت التعامل مع DataBound السيطرة ، عند القيام ListView1.FindControl("tdIsSuperCool") أنت في تخطيط القالب بحيث يعمل مثل بطل.

وضع كل ما منطق الأعمال التي تريد التحكم في رؤية td وكنت جيدة.

نصائح أخرى

حاول استخدام لوحة يمكنك بدوره على / قبالة

 foreach (ListViewItem item in ListView1.Items)
 {
     ((Panel)item.FindControl("myPanel")).Visible= False;
 }

ListView تمنحك السيطرة الكاملة حول كيفية البيانات المقدمة إلى العميل.يمكنك تحديد تخطيط القالب ، وإعطاء نائبا والتي سوف يكون فيها كل عنصر يتم حقن.

إخراج أدناه سوف تعطيك جدول كل بند جديد TR.

لاحظ استخدام runat= "الخادم" ، visible ='<%# %>'

<asp:ListView ID="ListView1" runat="server" DataSourceID="MyDataSource" ItemPlaceholderID="itemPlaceHolder">
    <LayoutTemplate>
        <table>
            <asp:PlaceHolder ID="itemPlaceHolder" runat="server" />
        </table>
    </LayoutTemplate>
    <ItemTemplate>
        <tr>
            <td runat="server" id="myCol" visible='<%# (bool)Eval("IsSuperCool") %>'>
                <%# Eval("SuperCoolIcon") %>
            </td>
            <td>
                <%# Eval("Name") %>
            </td>
            <td>
                <%# Eval("Age") %>
            </td>
        </tr>
    </ItemTemplate>
</asp:ListView>

أنا أعرف أنها مسألة قديمة جدا ولكن أنا فعلا القيام بذلك وأعتقد أنني وجدت لطيفة إلى حد ما طريقة للقيام بذلك عن طريق jquery و css.

أضف التالي إلى الرأس:

<script type="text/javascript" src="Scripts/jquery-1.7.1.min.js" ></script>
  <style>
    .hide {
      display:none;
    }
    .show {
      display:block;
    }
  </style>

كل الأعمدة التي تريد إخفاء ، إضافة خاصية مخصصة td/th.

<th runat="server" data-prop='authcheck'  id="tdcommentsHeader"  >Comments</th>

أنا إسداء المشورة إلى استخدام خاصية مخصصة لأن قصة قصيرة طويلة, أنها يمكن أن تقتل مجموعة من الطيور بحجر واحد.حتى أنك لن تحتاج إلى تغيير قيمة في كل عمود ، كما لو أننا على أساس هذه الخاصية معرف.

المقبل, ضمان أن يكون لديك حقل مخفي أن يقول يتيح لك معرفة ما إذا كان أو عدم إخفاء العمود.هذا يمكن أن يكون asp:HiddenField أو أي دولة أخرى طالما انها على شكل.

<asp:HiddenField runat="server" ID="IsAuthorized" Value="false" />

أخيرا, في أسفل الصفحة ، قم:

        <script type="text/javascript">
          $(document).ready(function () {
            var isauth = $("[id='IsAuthorized']").val();
              if (isauth==="false") {
              $("[data-prop='authcheck']").addClass('hide');
              //$("[id*='tdcomments']").addClass('hide'); 
            }
          });
      </script>

يمكنك دائما تعيين عرض العمود إلى 0 (صفر) إذا لم تجد طريقة أفضل.

Listview ليس لديهم مفهوم 'عمود' لأنه هو المقصود فقط أن يكون حسنا ، قائمة.

أنا ذاهب لنفترض أنك تستخدم ربط البيانات إلى إرفاق قائمة من 'الأشياء' إلى ListView.إذا كان هذا هو الحال ثم سيكون لديك فقط قائمة من البنود html في LayoutTemplate من يقرر فقط كيف يتم عرض العناصر.إذا كنت ثم نتحدث عن إنشاء جدول على غرار مجموعة من الأعمدة والصفوف ثم ربما DataGrid سيكون خيارا أفضل لأن هذا يعطي أكثر من ذلك بكثير تحكم برمجي من الأعمدة المحددة.

قد يكون من أن كنت على أمل إنشاء تخطيط الجدول بالكامل من خلال CSS ، وهو قرار مثير للإعجاب إذا هو محض لأغراض التخطيط.غير أن الشرط الخاص بك على وجه التحديد إخفاء عمود واحد يشير إلي أن الجدول هو الأفضل وضعها لتناسب الاحتياجات الخاصة بك.أنها على ما يرام لاستخدام الجداول جداول البيانات...IMHO...

إذا كنت حقا لا تحتاج إلى استخدام ListView ثم يمكنك دائما في محاولة ملزمة ضد شيء في البيانات الخاصة بك والذي يحدد ما إذا كان عنصر ينبغي أن تظهر أو لا ، على سبيل المثال:

style='display: <%#Eval("DisplayStyle") %>;'

ضع هذا الكود داخل عنصر html الذي تريد التحكم (في LayoutTemplate).ثم في الكائن أنت ملزم أن كنت بحاجة خاصية 'DisplayStyle' التي كانت إما مجموعة 'كتلة' أو 'لا شيء'.

للوصول إلى تخطيط قالب رأس العمود النص ، جعلتهم التسميات في القالب ، و findcontrol في عرض مسبق من listview ، ثم اتخذت تسميات فارغة النص إذا كان العمود يجب أن يكون "إيقاف".هذا قد لا تعمل على النوايا الخاصة بك, ولكن بالنسبة لي أنا لا تزال تريد مساحة العمود ليتم استخدامها فقط تظهر فارغة.

كذلك تذهب في محاولة لجعل listview انحنى إلى الوراء ، وكلما كنت سوف ترغب في استخدام الشبكة بدلا من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top