Avatar billede bertelsenbo Nybegynder
07. august 2008 - 14:49 Der er 12 kommentarer og
1 løsning

Mulighed for udtræk af values fra skjulte columns i et GridView?

Jeg har tilknyttet en DataTable til et GridView, og via en hjemmelavet select-event (via OnSelectedIndexChanged) overfører jeg værdierne til et par textboxe.
Men! Jeg kan kun overføre de værdier fra GridViewet som der bliver vist! Hvis jeg har en Column der er visible false, så kan jeg ikke trække data ud via "grdvwCases.Rows[indexInt].Cells[2].Text;" eftersom Celle nr 2 ikke kan findes når det er skjult.

Hvordan gør jeg så? Jeg skal have nogle parametre med fra GridView'et uden at eksponere dem for brugeren.
Jeg overvejede om man ikke kunne lave en kobling mellem GridViewet og DataTablen. Dog har jeg ingen unikke værder som jeg kan søge på (der må eksponeres for brugeren), og selectedIndex kan ikke bruges i denne sammehæng eftersom den kan ændre sig alt efter hvilken side man er på i gridviewet (altså med paging).
Avatar billede bertelsenbo Nybegynder
07. august 2008 - 14:49 #1
Sig til hvis i vil se noget kode.
Avatar billede sph1nx Nybegynder
07. august 2008 - 15:16 #2
Måske ikke så pæn en løsning, men kunne du køre med 2 grids/datatables, det du viser for brugeren, og en kopi som du bruger internt, hvis du forstår?

det giver selvfølgelig dobbelt vedligeholdelse da du skal slette og tilføje 2 steder osv.

men det kunne være en løsning
Avatar billede bertelsenbo Nybegynder
07. august 2008 - 16:45 #3
Hvis det var til eget brug ville jeg bruge den løsning. Dog skal det være "pæn" kode da det er til arbejdet.
Avatar billede sph1nx Nybegynder
07. august 2008 - 21:54 #4
Hva gemmer du i den "skjult" kolonne?
Avatar billede bertelsenbo Nybegynder
08. august 2008 - 06:54 #5
Der er 2 ting som jeg skal have gjort noget ved. Der er 2 kolonner, de viser hhv. ID (int) og Status (Boolean). ID skal ikke vises til brugeren/den besøgende da det er grimt og forstyrrer. Derudover skal jeg finde ud af at formatere Status så der ikke bare står False/True, men står Closed/Open. :-)
Avatar billede sph1nx Nybegynder
08. august 2008 - 08:23 #6
mht til den status, kan du så ikke gøre noget i den her stil :

  void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
                if ((bool)dataGridView1[0, e.RowIndex].Value == true)
                {
                    dataGridView1[0, e.RowIndex].Value = "OPEN";
                }
                else
                {
                    dataGridView1[0, e.RowIndex].Value = "CLOSED";
                }
        }

skal lige siges jeg er på arbejde, så det er skrevet ud fra hukommelsen, og den kan jo fejle, MEN det burde virke
Avatar billede bertelsenbo Nybegynder
08. august 2008 - 09:11 #7
Tak for rådet sph1nx, men fandt ud af at man kan lave et Template field :-)

<asp:TemplateField HeaderText="Status">
<ItemTemplate>
  <%# PrintFriendlyStatus((Boolean)Eval("Closed"))%>
</ItemTemplate>
</asp:TemplateField>

public string PrintFriendlyStatus(Boolean status)
{
if (status)
{
  return "<font color='green'><b>Resolved</b></font>";
}
else
{
  return "<font color='red'><b>Assigned</b></font>";
}
}

Mangler dog stadig en løsning på det oprindlige spørgsmål. Hvordan skjuler jeg column ID hvor jeg fortsat kan læse fra den...?
Avatar billede sph1nx Nybegynder
08. august 2008 - 13:23 #8
Så, nu jeg kigget på det, og jeg kan få det til, godt nok i en windows app, at virke således.

1. du skal ikke skjule "column" på datatable, men på datagridview, så kan du uden problemer læse den ud.

DataTable dt;
        public Form1()
        {
            InitializeComponent();
            dt = new DataTable("TestTable");
            dt.Columns.Add("Test");
            dt.Columns.Add("HIDDEN");
     
           
            dt.Rows.Add(new object[] { true,1 });
            //dataGridView1.Columns.Add("test", "test");
            dataGridView1.DataSource = dt;
            dataGridView1.Columns["HIDDEN"].Visible = false;
        }

  private void button1_Click(object sender, EventArgs e)
        {

            MessageBox.Show((String)dataGridView1[1, 0].Value);
        }

men det er som sagt i en windows app
Avatar billede bertelsenbo Nybegynder
08. august 2008 - 14:33 #9
prøv en gang med mit eksempel i asp.NET c#.

aspx:

<asp:GridView runat="server" ID="GV" AutoGenerateColumns="false">
        <Columns>
            <asp:BoundField DataField="Field1" HeaderText="Field 1" />
            <asp:BoundField DataField="Field2" Visible="false" HeaderText="Field 2" />
        </Columns>
    </asp:GridView>
    <asp:Label ID="lbl" runat="server" Text="Label"></asp:Label>

aspx.cs:

    public DataTable DT;
    private DataColumn column;
    private DataRow[] rows;
    private DataRow row;

    protected void Page_Load(object sender, EventArgs e)
    {

        if (DT == null)
        {
          DT = new DataTable();
        }

        column = new DataColumn();
        column.DataType = System.Type.GetType("System.String");
        column.ColumnName = "Field1";
        DT.Columns.Add(column);

        column = new DataColumn();
        column.DataType = System.Type.GetType("System.String");
        column.ColumnName = "Field2";
        DT.Columns.Add(column);

        Add("test1", "test2");
        Add("test3", "test4");
        Add("test5", "test6");

        GV.DataSource = DT;
        GV.DataBind();

        //Printer teksten: test3
        lbl.Text += GV.Rows[1].Cells[0].Text;
        //Printer en tom streng eftersom Field2 column er skjult. Resultatet burde have været test4
        lbl.Text += GV.Rows[1].Cells[0].Text;
    }

    public void Add(string st1, string st2)
    {

        row = DT.NewRow();
        row["Field1"] = st1;
        row["Field2"] = st2;
        DT.Rows.Add(row);
    }
Avatar billede bertelsenbo Nybegynder
08. august 2008 - 14:34 #10
Rettelse:
        //Printer en tom streng eftersom Field2 column er skjult. Resultatet burde have været test4
        lbl.Text += GV.Rows[1].Cells[1].Text;
Avatar billede sph1nx Nybegynder
08. august 2008 - 15:37 #11
SÅ :

ASPX :

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Untitled Page</title>
    <style type="text/css">
 
.Hide { display:none; }

</style>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView runat="server" ID="GV" AutoGenerateColumns="false">
        <Columns>
            <asp:BoundField DataField="Field1" HeaderText="Field 1" />
            <asp:BoundField DataField="Field2" HeaderText="Field 2">
              <ItemStyle CssClass="Hide" />
              <HeaderStyle CssClass="Hide" />
          </asp:BoundField>
        </Columns>
    </asp:GridView>
    <asp:Label ID="lbl" runat="server" Text="Label"></asp:Label>
    </form>
</body>
</html>

har tilføjet en CSS style mellem Head tagget og brugt den på det felt du vil skjule, om det er så er en løsning du vil acceptere :P
Avatar billede bertelsenbo Nybegynder
08. august 2008 - 17:38 #12
Hehe, det godtager jeg som en løsning eller en såkaldt "work-around" :-)
Tester det af på et senere tidspunkt, men svar du bare for point og MANGE tak for hjælpen. Sætter pris på din indsats!
Avatar billede sph1nx Nybegynder
08. august 2008 - 18:29 #13
Så lidt, hvis jeg får tid, skal jeg se om jeg kan finde en pænere løsning i aften.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester